2

我有一个包含多个字段和一个额外的不同步字段的表。创建了一个触发器和触发器函数以在任何更新/插入之前将 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...

提前谢谢你的帮助!

4

1 回答 1

4

至少四个选项:

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

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

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

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

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

如果您使用的是 Pg 9.1 或更早版本,则必须mycustom_variable_classes. 在 9.2 及更高版本中,任何带有句点 ( .) 的变量都被假定为自定义变量。

另请参阅将用户 ID 传递给触发器

于 2013-04-21T02:03:39.867 回答