postgresql – 更新columnA或ColumnB或ColumnC时触发的触发器
我有代码只在更新单个特定列时触发触发器.触发器用于触发一个函数,该函数将引发postgres“notify”事件,我正在侦听并需要测试并验证新输入的详细信息. account_details表上有许多值可以更改,不需要帐户验证,因此仅在AFTER UPDATE(没有时间)的触发器是不好的.
CREATE TRIGGER trigger_update_account_details AFTER UPDATE ON account_details FOR EACH ROW WHEN (OLD.email IS DISTINCT FROM NEW.email) EXECUTE PROCEDURE notify_insert_account_details(); 但是如果许多列中的一个发生变化,我想触发触发器 WHEN (OLD.email IS DISTINCT FROM NEW.email OR OLD.username IS DISTINCT FROM NEW.username OR OLD.password IS DISTINCT FROM NEW.password) 但OR不是触发器的有效关键字.试图搜索要使用的关键字而不是OR似乎没有提出任何由于单词OR的性质:-(
这是一种误解.
WHEN clause of the trigger definition expects a boolean expression并且您可以根据需要使用尽可能多的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 ... 因为,per documentation:
既然你提到了很多专栏.您可以使用 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) ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |