PostgreSQL触发器“;什么时候;不起作用
我得到了一个带有时间戳字段的表,该字段必须在行更改后更新。 函数PostgreSQL触发器“;什么时候;不起作用,postgresql,triggers,plpgsql,Postgresql,Triggers,Plpgsql,我得到了一个带有时间戳字段的表,该字段必须在行更改后更新。 函数change\u update\u time()更新名为updated\u time的时间戳字段。 我的触发器工作正常,但当子句时,我无法添加更多的(系统只是忽略了它们) 代码: 这是我的触发器: CREATE TRIGGER update_updated_time_trigger BEFORE UPDATE ON data_table FOR EACH ROW WHEN ( (OLD.column1 &l
change\u update\u time()
更新名为updated\u time
的时间戳字段。
我的触发器工作正常,但当子句时,我无法添加更多的(系统只是忽略了它们)
代码:
这是我的触发器:
CREATE TRIGGER update_updated_time_trigger
BEFORE UPDATE
ON data_table
FOR EACH ROW
WHEN (
(OLD.column1 <> NEW.column1) AND
(OLD.column2 <> NEW.column2)
)
EXECUTE PROCEDURE change_update_time();
数据库版本:PostgreSQL 9.3.4可能的原因(信息不足,无法确定):
您的条件不捕获从/到NULL的任何更改。定义了非空列1
和列2
,或者您需要调整:
WHEN (OLD.column1 IS DISTINCT FROM NEW.column1 AND
OLD.column2 IS DISTINCT FROM NEW.column2)
另一个典型原因是:其他触发因素介入。您必须列出问题中的所有触发器。我们需要一个表定义来获取基本信息。在psql
中使用\d data\u table
可以得到什么。您可能想要OLD.colname
与NEW.colname不同,而不是OLD.colnameNEW.colname
,否则当涉及NULL
值时,触发器将不会执行。为什么要在子句时添加更多?您已经找到了解决方案:只需将它们与和或或连接起来。此外,如果您想在添加的每一列之后扩展触发器的WHEN
子句,您可以只使用行比较:WHEN OLD与NEW
或(对于某些列):WHEN row(OLD.c1、OLD.c2、OLD.c3)不同于行(NEW.c1、NEW.c2、NEW.c3)
(但这将像比较之间存在或,只有当两列同时更改时,示例触发器才会激活)。
WHEN (OLD.column1 IS DISTINCT FROM NEW.column1 AND
OLD.column2 IS DISTINCT FROM NEW.column2)