在 PostgreSQL 数据库中,我有一个名为SURVEYS
的表,如下所示:
| ID (uuid) | name (varchar) | status (boolean) | update_at (timestamp) |
|--------------------------------------|----------------|------------------|--------------------------|
| 9bef1274-f1ee-4879-a60e-16e94e88df38 | Doom | 1 | 2019-03-26 00:00:00 |
如您所见,该表包含列status
和update_at
。
我的任务是创建一个触发器,如果用户将status
列中的值更新为2
并更改update_at
列中的值,则将启动该函数。在函数中,我将使用已更改条目的ID。我创建了这样一个触发器。您认为在触发器中检查列值是否正确,还是需要在函数中进行检查?我有点困惑。
CREATE TRIGGER СHECK_FOR_UPDATES_IN_SURVEYS
BEFORE UPDATE ON SURVEYS
FOR EACH ROW
WHEN
(OLD.update_at IS DISTINCT FROM NEW.update_at)
AND
(OLD.condition IS DISTINCT FROM NEW.condition AND NEW.condition = 2)
EXECUTE PROCEDURE CREATE_SURVEYS_QUESTIONS_RELATIONSHIP(NEW.id);
答案 0 :(得分:1)
您的触发器看起来还不错。
只有一个轻微的语法问题:整个WHEN
子句必须用括号括起来。
此外,除了常量之外,您不能将任何其他内容传递给触发函数。但是您完全不需要这样做:NEW
将自动在触发功能中可用。
所以您可以这样写:
CREATE TRIGGER СHECK_FOR_UPDATES_IN_SURVEYS
BEFORE UPDATE ON SURVEYS
FOR EACH ROW
WHEN
(OLD.update_at IS DISTINCT FROM NEW.update_at
AND
OLD.condition IS DISTINCT FROM NEW.condition AND NEW.condition = 2)
EXECUTE PROCEDURE CREATE_SURVEYS_QUESTIONS_RELATIONSHIP();
始终最好检查触发器定义中的条件,因为这将节省您不必要的函数调用。