Tulis fungsi pemicu. Sesuatu seperti ini:
CREATE OR REPLACE FUNCTION trg_backup_row()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO other_tbl
SELECT (OLD).*, t.other_col -- all columns of from old table
-- SELECT OLD.col1, OLD.col2, t.other_col -- alternative: some cols from old tbl
FROM third_tbl t
WHERE t.col = OLD.col -- link to third table with info from deleted row
AND <unique_condition_to_avoid_multiple_rows_if_needed>;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Dan pemicu ON DELETE
. Seperti ini:
CREATE TRIGGER delaft
AFTER DELETE
ON tbl
FOR EACH ROW
EXECUTE PROCEDURE trg_backup_row();
Elemen kunci
-
Sebaiknya jadikan pemicu
AFTER DELETE
danFOR EACH ROW
. -
Untuk mengembalikan semua kolom dari tabel lama gunakan sintaks
(OLD).*
. Lihat manual tentang mengakses jenis komposit . AtauOLD.*
adalah sintaks yang valid juga, karenaOLD
ditambahkan keFROM
klausa secara implisit. UntukVALUES
ekspresinya harus(OLD).*
, meskipun. Seperti:INSERT INTO other_tbl VALUES((OLD).*, some_variable)
-
Anda dapat memasukkan nilai dari tabel lain seperti yang saya tunjukkan. Pastikan untuk mendapatkan satu baris, atau Anda membuat beberapa entri.
-
Saat pemicu memicu
AFTER
acara, fungsi dapatRETURN NULL
.
Tentang visibilitas
Menanggapi komentar waspada @couling.
Sedangkan kunci asing dapat dideklarasikan sebagai DEFERRED
, ini hanya akan menunda pemeriksaan integritas, bukan penghapusan itu sendiri. Baris yang dihapus di pemicu dieksekusi sebelum yang ada atau oleh ON DELETE CASCADE
kunci asing tidak akan terlihat lagi pada saat ini AFTER DELETE
pemicu disebut. (Semuanya jelas terjadi dalam satu transaksi. Tak satu pun dari detail ini penting untuk transaksi lain, yang akan melihat semua atau tidak ada efeknya. Lihat manual untuk lebih lanjut tentang Model MVCC dan isolasi transaksi
.)
Oleh karena itu, jika Anda ingin memasukkan nilai dari baris tergantung sedemikian rupa di INSERT
. Anda , pastikan untuk memanggil pemicu ini sebelum baris tersebut akan dihapus.
Anda mungkin harus membuat pemicu ini BEFORE DELETE
.
Atau bisa juga berarti Anda harus mengurutkan pemicu yang sesuai, BEFORE
pemicu datang sebelum AFTER
pemicu, jelas. Dan pemicu pada tingkat yang sama dieksekusi dalam urutan abjad
.
Namun, selama saya sangat tepat di sini, saya mungkin juga menambahkan bahwa perubahan yang dilakukan pada baris (atau baris tergantung) di BEFORE
lain pemicu juga hanya terlihat jika dipanggil sebelum yang ini.
Saran saya buatlah AFTER
pemicunya adalah karena kurang rentan terhadap komplikasi dan lebih murah jika pemicu lain dapat membatalkan (memutar kembali) DELETE
setengah jalan melalui operasi - selama tidak ada hal di atas yang berlaku.