我有一个包含多个字段的表和一个额外的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然后...
提前感谢您的帮助!
答案 0 :(得分:4)
至少有四个选项:
设置为另一个用户同步并在触发器中测试current_user
;
在更新同步字段之前,在事务中定义自定义配置变量(GUC)和SET LOCAL
或set_config(...)
;测试GUC中的触发器并根据它改变行为;
在设置同步之前暂时禁用事务中的触发器;
让触发器检查更新是否所有其他值都未更改,并且如果没有其他值发生更改,则允许同步设置为true。使用IS DISTINCT FROM
进行此测试可以方便地处理空值。
我可能自己使用自定义GUC,current_setting('my.guc')
从触发器中获取值。
如果您使用的是Pg 9.1或更早版本,则必须将my
(或任何您真正称之为前缀的内容)添加到custom_variable_classes
。在9.2及以上版本中,任何带有句点(.
)的变量都被假定为自定义变量。