Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL触发器“;什么时候;不起作用_Postgresql_Triggers_Plpgsql - Fatal编程技术网

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)