如何创建一个触发器来跟踪对特定列的更改?
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 包含列 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);
你的触发器看起来很好。
只有一个轻微的语法问题:整个 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();
最好在触发器定义中检查条件,因为这样可以避免不必要的函数调用。
在 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 包含列 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);
你的触发器看起来很好。
只有一个轻微的语法问题:整个 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();
最好在触发器定义中检查条件,因为这样可以避免不必要的函数调用。