यह एक गलतफहमी है। WHEN
ट्रिगर परिभाषा का खंड एक boolean
की अपेक्षा करता है अभिव्यक्ति और आप उपयोग कर सकते हैं OR
इसमें ऑपरेटरों। यह बस काम करना चाहिए (यह देखते हुए कि सभी कॉलम वास्तव में तालिका में मौजूद हैं account_details
) मैं स्वयं समान ट्रिगर का उपयोग कर रहा हूं:
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();
व्यंजक का मूल्यांकन करने में बहुत कम लागत आती है, लेकिन यह संभवतः अधिक विश्वसनीय है विकल्प के बजाय:
CREATE TRIGGER ... AFTER UPDATE OF email, username, password ...
क्योंकि, प्रति दस्तावेज़:
<ब्लॉकक्वॉट>
एक स्तंभ-विशिष्ट ट्रिगर (जिसे UPDATE OF
. का उपयोग करके परिभाषित किया गया है) column_name
सिंटैक्स) तब सक्रिय होगा जब इसके किसी भी कॉलम को UPDATE
. में लक्ष्य के रूप में सूचीबद्ध किया जाएगा कमांड का SET
सूची। किसी स्तंभ के मान के लिए ट्रिगर सक्रिय न होने पर भी बदलना संभव है, क्योंकि BEFORE UPDATE
द्वारा पंक्ति की सामग्री में किए गए परिवर्तन ट्रिगर्स पर विचार नहीं किया जाता है। इसके विपरीत, एक कमांड जैसे UPDATE ... SET x = x ...
स्तंभ x पर ट्रिगर सक्रिय करेगा, भले ही स्तंभ का मान नहीं बदला।
ROW
टाइप सिंटैक्स कई कॉलमों पर जांच करने के लिए छोटा है (ऐसा ही करते हुए):
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();
या, प्रत्येक . की जांच करने के लिए पंक्ति में दृश्यमान उपयोगकर्ता स्तंभ:
...
WHEN (OLD IS DISTINCT FROM NEW)
...