如何创建一个触发器来跟踪对特定列的更改?

时间:2019-03-26 17:45:55

标签: sql postgresql database-trigger

PostgreSQL 数据库中,我有一个名为SURVEYS的表,如下所示:

| ID (uuid)                            | name (varchar) | status (boolean) | update_at (timestamp)    |  
|--------------------------------------|----------------|------------------|--------------------------|
| 9bef1274-f1ee-4879-a60e-16e94e88df38 | Doom           | 1                | 2019-03-26 00:00:00      |

如您所见,该表包含列statusupdate_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);

1 个答案:

答案 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();

始终最好检查触发器定义中的条件,因为这将节省您不必要的函数调用。