使用多个WHEN条件触发

问题描述 投票:0回答:2

如何包含我需要监控的列? IE。我想要 3 个

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();
postgresql triggers ddl boolean-expression
2个回答
7
投票

使用

OR
AND
形成单个表达式 - 取决于您是否要在满足 all 条件或满足 one:

时触发
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 FUNCTION update_sessioninfo();

参见:

它只是一个布尔表达式,可以涉及该行的所有列。
但是,你的表达只对

UPDATE
有意义,对
INSERT
没有意义。没有用于插入的
OLD
记录。 手册
CREATE TRIGGER

condition

布尔表达式,决定触发函数是否会 实际被执行。如果指定了

WHEN
,则该函数将仅是 如果
condition
返回
true
,则调用。在
FOR EACH ROW
触发器中,
WHEN
条件可以引用旧的和/或新的行值的列 分别写
OLD.
column_name
NEW.
column_name
。当然,
INSERT
触发器不能引用
OLD
并且
DELETE
触发器不能引用
NEW

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

name

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

粗体强调我的。


-1
投票

TG_WHEN

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

这是一个可以使用的链接

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

© www.soinside.com 2019 - 2024. All rights reserved.