触发多个WHEN条件

时间:2013-08-21 14:26:47

标签: postgresql triggers ddl boolean-expression

如何包含我需要监控的列?即而不是一个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();

2 个答案:

答案 0 :(得分:4)

使用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 ,而不适用于INSERT。插入没有OLD记录。 The manual on CREATE TRIGGER

  

<强> condition

     

一个布尔表达式,用于确定触发器函数是否会   实际上是执行。如果指定了WHEN,则该函数将仅为   如果 condition 返回true,则会调用此方法。在FOR EACH ROW触发器中,   WHEN条件可以引用旧行和/或新行值的列   撰写OLD. column_name NEW. column_name 分别。当然,   INSERT触发器无法引用OLD,而DELETE触发器无法引用NEW

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

  

<强> name

     

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

大胆强调我的。

答案 1 :(得分:0)

TG_WHEN

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

这里有一个链接可能会使用

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