更新字段由触发器更新

时间:2013-04-20 19:17:22

标签: postgresql triggers

我有一个包含多个字段的表和一个额外的outofsync字段。 创建了一个触发器和触发器函数,用于在任何更新/插入之前将outofsync字段值设置为true。

触发:

CREATE TRIGGER goods_update_outofsync
  BEFORE UPDATE
  ON goods
  FOR EACH ROW
  EXECUTE PROCEDURE tg_update_goods_outofsync();

触发功能:

CREATE OR REPLACE FUNCTION tg_update_goods_outofsync()
  RETURNS trigger AS
$BODY$
    BEGIN
    NEW.outofsync=true;
    RETURN NEW;
    END;
    $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION tg_update_goods_outofsync()
  OWNER TO postgres;

现在出现了一个“简单”的问题我无法找到答案:如何手动将outofsync字段更新为false,因为每次尝试后它都会被触发器自动更改为true。

编辑:

这几乎有效:

IF (NEW.outofsync = OLD.outofsync) THEN
    NEW.outofsync=true;
END IF;

除非outofsync字段的值已经为false且我想将其设置为false,因为它变为true然后...

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

至少有四个选项:

  • 设置为另一个用户同步并在触发器中测试current_user;

  • 在更新同步字段之前,在事务中定义自定义配置变量(GUC)和SET LOCALset_config(...);测试GUC中的触发器并根据它改变行为;

  • 在设置同步之前暂时禁用事务中的触发器;

  • 让触发器检查更新是否所有其他值都未更改,并且如果没有其他值发生更改,则允许同步设置为true。使用IS DISTINCT FROM进行此测试可以方便地处理空值。

我可能自己使用自定义GUC,current_setting('my.guc')从触发器中获取值。

如果您使用的是Pg 9.1或更早版本,则必须将my(或任何您真正称之为前缀的内容)添加到custom_variable_classes。在9.2及以上版本中,任何带有句点(.)的变量都被假定为自定义变量。

另见passing user ID to triggers