Ini adalah kesalahpahaman. WHEN
klausa definisi pemicu mengharapkan boolean
ekspresi dan Anda dapat menggunakan OR
operator di dalamnya. Ini seharusnya berfungsi (mengingat bahwa semua kolom benar-benar ada di tabel account_details
). Saya sendiri menggunakan pemicu serupa:
CREATE TRIGGER trigger_update_account_details
AFTER UPDATE ON account_details
FOR EACH ROW
WHEN (OLD.email IS DISTINCT FROM NEW.email
OR OLD.username IS DISTINCT FROM NEW.username
OR OLD.password IS DISTINCT FROM NEW.password)
EXECUTE PROCEDURE notify_insert_account_details();
Mengevaluasi ekspresi membutuhkan biaya yang kecil, tetapi ini mungkin lebih dapat diandalkan daripada alternatifnya:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Karena, per dokumentasi:
Pemicu khusus kolom (pemicu yang ditentukan menggunakan
UPDATE OF
column_name
sintaks) akan diaktifkan ketika salah satu kolomnya terdaftar sebagai target diUPDATE
SET
perintah daftar. Nilai kolom dapat berubah meskipun pemicu tidak diaktifkan, karena perubahan dilakukan pada konten baris olehBEFORE UPDATE
pemicu tidak dipertimbangkan. Sebaliknya, perintah sepertiUPDATE ... SET x = x ...
akan memicu pemicu pada kolom x, meskipun nilai kolom tidak berubah.
ROW
sintaks ketik lebih pendek untuk memeriksa banyak kolom (melakukan hal yang sama):
CREATE TRIGGER trigger_update_account_details
AFTER UPDATE ON account_details
FOR EACH ROW
WHEN ((OLD.email, OLD.username, OLD.password, ...)
IS DISTINCT FROM
(NEW.email, NEW.username, NEW.password, ...))
EXECUTE PROCEDURE notify_insert_account_details();
Atau, untuk memeriksa setiap kolom pengguna yang terlihat di baris:
...
WHEN (OLD IS DISTINCT FROM NEW)
...