Pemicu: pindahkan baris yang dihapus ke tabel arsip

18

Saya memiliki tabel kecil (~ 10 baris) yang disebut restrictionsdalam database PostgreSQL saya, di mana nilai-nilai dihapus dan dimasukkan setiap hari.

Saya ingin memiliki tabel bernama restrictions_deleted, di mana setiap baris yang dihapus restrictionsakan disimpan secara otomatis. Karena restrictionsmemiliki nomor seri, tidak akan ada duplikat.

Bagaimana saya menulis pemicu seperti itu di PostgreSQL?

Adam Matan
sumber

Jawaban:

15

Anda hanya perlu memindahkan data lama ke dalam restrictions_deletedtabel sebelum dihapus. Ini dilakukan dengan OLDtipe data. Anda dapat menggunakan INSERTpernyataan regulat dan dan menggunakan OLDnilai sebagai nilai yang akan disisipkan.

CREATE TRIGGER moveDeleted
BEFORE DELETE ON restrictions 
FOR EACH ROW
EXECUTE PROCEDURE moveDeleted();


CREATE FUNCTION moveDeleted() RETURNS trigger AS $$
    BEGIN
       INSERT INTO restrictions_deleted VALUES(OLD.column1, OLD.column2,...);
       RETURN OLD;
    END;
$$ LANGUAGE plpgsql;
DrColossos
sumber
2
Anda dapat mengganti daftar eksplisit nilai kolom dengan sesuatu sepertiVALUES((OLD).*)
KayEss
1
Bekerja dengan baik, tetapi create functionkebutuhan untuk dipanggil sebelumnya create trigger. Dan VALUES((OLD).*)trik yang disarankan oleh KayEss bagus.
mivk
8

Jika Anda terbuka untuk pendekatan yang berbeda, Sudahkah Anda mempertimbangkan untuk menambahkan tanda Boolean 'dihapus' ke tabel, atau timestamp 'dihapus_at' sebagai gantinya.

Atau lebih baik lagi, tolak akses CRUD ke tabel basis data Anda dan tangani jejak audit di API transaksional Anda :)

Jack Douglas
sumber
+1 Terima kasih - tidak akan berfungsi untuk kasus saya, tapi ini pendekatan yang bagus yang hanya menggunakan satu tabel.
Adam Matan