【问题标题】:Trigger with multiple WHEN conditions使用多个 WHEN 条件触发
【发布时间】:2013-08-21 14:26:46
【问题描述】:

如何包含我需要监控的列? IE。而不是一个WHEN 条件我想要3 个WHEN 条件:

CREATE  TRIGGER freeradius.insert_into_day_summations 
     BEFORE INSERT ON freeradius.day_guiding_usage
     FOR EACH ROW 
     WHEN (OLD.col1 IS DISTINCT FROM NEW.col1)
     WHEN (OLD.col2 IS DISTINCT FROM NEW.col2)
     WHEN (OLD.col3 IS DISTINCT FROM NEW.col3)
EXECUTE procedure update_sessioninfo();

【问题讨论】:

  • 您是否尝试将它们与OR 结合起来?文档说这只是一个布尔条件。应该可以正常工作。

标签: postgresql triggers ddl boolean-expression


【解决方案1】:

使用ORAND 形成一个表达式 - 取决于您是要在满足 所有 条件时触发,还是在满足任一一个 条件时触发:

CREATE TRIGGER update_day_summations  -- see below
BEFORE UPDATE ON freeradius.day_guiding_usage
FOR EACH ROW 
WHEN (OLD.col1 IS DISTINCT FROM NEW.col1
   OR OLD.col2 IS DISTINCT FROM NEW.col2
   OR OLD.col3 IS DISTINCT FROM NEW.col3)
EXECUTE procedure update_sessioninfo();

这只是一个布尔表达式,可以涉及行的所有列。
但是,您的表达式仅对 UPDATE 有意义,不适用于 @987654326 @。没有用于插入的 OLD 记录。 The manual on CREATE TRIGGER:

condition

一个布尔表达式,用于确定触发函数是否将 实际被执行。如果指定了WHEN,该函数将只 如果 condition 返回 true,则调用。在FOR EACH ROW 触发器中, WHEN 条件可以引用旧和/或新行值的列 分别写OLD.column_nameNEW.column_name。当然, INSERT 触发器不能引用 OLDDELETE 触发器不能引用 NEW

并且触发器名称本身不能是模式限定的。再次引用手册:

name

赋予新触发器的名称。这必须与同一表的任何其他触发器的名称不同。这 名称不能是架构限定的

粗体强调我的。

【讨论】:

    【解决方案2】:

    TG_WHEN

    数据类型文本;一个 BEFORE、AFTER 或 INSTEAD OF 字符串,具体取决于触发器的定义。

    这里有一个链接可以使用

    http://www.postgresql.org/docs/9.2/static/plpgsql-trigger.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 2021-11-04
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多