Dari manual yang bagus:
36.1. Ikhtisar Perilaku Pemicu
[...]
Untuk pemicu tingkat baris, data masukan juga menyertakanNEW
baris untukINSERT
danUPDATE
pemicu, dan/atauOLD
baris untukUPDATE
danDELETE
pemicu. Pemicu tingkat pernyataan saat ini tidak memiliki cara untuk memeriksa setiap baris yang dimodifikasi oleh pernyataan.
Dan dari Prosedur Pemicu:
NEW
Tipe dataRECORD
; variabel memegang baris database baru untukINSERT
/UPDATE
operasi di pemicu tingkat baris. Variabel ini adalahNULL
dalam pemicu tingkat pernyataan dan untukDELETE
operasi.
Perhatikan apa yang dikatakan tentang pemicu tingkat baris dan pemicu tingkat pernyataan.
Anda memiliki pemicu tingkat pernyataan:
...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();
Pemicu tingkat pernyataan dipicu sekali per pernyataan dan pernyataan dapat diterapkan ke beberapa baris sehingga gagasan baris yang terpengaruh (itulah yang NEW
dan OLD
tentang) sama sekali tidak berlaku.
Jika Anda ingin menggunakan NEW
(atau OLD
) di pemicu maka Anda ingin pemicu dijalankan untuk setiap baris yang terpengaruh dan itu berarti Anda menginginkan pemicu tingkat baris:
CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();
Saya baru saja mengubah FOR EACH STATEMENT
ke FOR EACH ROW
.
Pemicu Anda juga harus mengembalikan sesuatu:
Fungsi pemicu harus mengembalikan
NULL
atau nilai record/baris yang memiliki struktur tabel yang persis sama dengan pemicu pemicunya.
[...]
Nilai kembalian pemicu tingkat baris dipicuAFTER
atau pemicu tingkat pernyataan memicuBEFORE
atauAFTER
selalu diabaikan; mungkin juga nol. Namun, salah satu jenis pemicu ini mungkin masih membatalkan seluruh operasi dengan memunculkan kesalahan.
Jadi Anda harus RETURN NEW;
atau RETURN NULL;
di pemicu Anda. Anda memiliki pemicu AFTER sehingga tidak masalah RETURN mana yang Anda gunakan, tetapi saya akan menggunakan RETURN NEW;
.