Đây là một sự hiểu lầm. WHEN
mệnh đề của định nghĩa trình kích hoạt yêu cầu một boolean
biểu thức và bạn có thể sử dụng OR
các toán tử trong đó. Điều này sẽ hoạt động (với điều kiện là tất cả các cột thực sự tồn tại trong bảng account_details
). Bản thân tôi cũng đang sử dụng các trình kích hoạt tương tự:
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();
Đánh giá biểu thức có một chi phí nhỏ, nhưng điều này có lẽ đáng tin cậy hơn hơn lựa chọn thay thế:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
Bởi vì, theo tài liệu:
Trình kích hoạt dành riêng cho cột (một trình kích hoạt được xác định bằng cách sử dụng
UPDATE OF
column_name
cú pháp) sẽ kích hoạt khi bất kỳ cột nào của nó được liệt kê là mục tiêu trongUPDATE
SET
của lệnh danh sách. Giá trị của cột có thể thay đổi ngay cả khi trình kích hoạt không được kích hoạt, bởi vì các thay đổi được thực hiện đối với nội dung của cột bởiBEFORE UPDATE
kích hoạt không được xem xét. Ngược lại, một lệnh nhưUPDATE ... SET x = x ...
sẽ kích hoạt atrigger trên cột x, mặc dù giá trị của cột không thay đổi.
ROW
cú pháp gõ ngắn hơn để kiểm tra trên nhiều cột (làm tương tự):
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();
Hoặc, để kiểm tra mọi cột người dùng hiển thị trong hàng:
...
WHEN (OLD IS DISTINCT FROM NEW)
...