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

问题描述 投票:0回答:1

在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);
sql postgresql database-trigger
1个回答
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();

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

© www.soinside.com 2019 - 2024. All rights reserved.