使用多个 WHEN 条件触发

use*_*853 2 postgresql ddl triggers boolean-expression

如何包含需要监控的列?即WHEN我想要三个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();
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 5

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

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();
Run Code Online (Sandbox Code Playgroud)

它只是一个布尔表达式,可以涉及行的所有列。
但是,您的表达式只对 有意义,对UPDATE没有意义INSERT。没有OLD插入记录。手册CREATE TRIGGER

condition

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

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

name

赋予新触发器的名称。这必须与同一表的任何其他触发器的名称不同。该 名称不能用模式修饰

大胆强调我的。