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

How to create a trigger that tracks changes to specific columns?

PostgreSQL 数据库中,我有一个名为 SURVEYS 的 table,它看起来像这样:

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

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

你的触发器看起来很好。

只有一个轻微的语法问题:整个 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();

最好在触发器定义中检查条件,因为这样可以避免不必要的函数调用。