当NEW.column = true时,Postgres触发仅执行过程

时间:2015-04-22 04:11:43

标签: postgresql triggers ddl

使用PostgreSQL - 我试图仅在NEW(插入或更新)行is_default列值设置为boolean true时触发运行触发器的过程

这是我尝试过但我在WHEN行上出现语法错误:

CREATE TRIGGER trigger_price_group_default_price_handler
    BEFORE UPDATE OR INSERT
    ON price_groups
    WHEN (NEW.is_default = true)
    EXECUTE PROCEDURE clear_default_price_group();

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

似乎是一种疏忽:FOR EACH ROW缺失:

CREATE TRIGGER trigger_price_group_default_price_handler
 BEFORE UPDATE OR INSERT ON price_groups
 FOR EACH ROW
 WHEN (NEW.is_default)
 EXECUTE PROCEDURE clear_default_price_group();

如果您不提供,per documentation

  

如果未指定,则 FOR EACH STATEMENT是默认

大胆强调我的。并且您无法在语句级触发器中引用NEWOLD,这会使WHEN子句(引用NEW)语法错误 - 在任何版本的Postgres的

  

语句级触发器也可以有WHEN条件,尽管如此   功能对他们没那么有用,因为条件不能参考   表中的任何值。

除此之外,至少需要Postgres 9.0才能在WHEN中使用CREATE TRIGGER条款

我认为罕见的情况FOR EACH STATEMENT是默认情况,这有点不幸。我认为必须是出于历史原因。

除此之外:表达式NEW.is_default = true只是说NEW.is_default的嘈杂方式。 boolean值可以直接用作表达式。

答案 1 :(得分:0)

在看起来正确代码的情况下,显然无法解释的语法错误的最可能原因是您使用的服务器版本不理解语法。

例如,条件触发器为introduced in PostgreSQL 9.0,并且为not present in 8.4 or older,因此8.4或更早的服务器不会知道WHEN ...的含义。

我试图在pgsql-docs邮件列表上进行论证,我们应该包括“自[版本]”以及功能描述,但每个人似乎都喜欢引导人们阅读他们的版本的文档。所以我没有走远。至少PostgreSQL与其他版本的文档有快速链接,不像太多项目(咳嗽 Hibernate 咳嗽)。

(这也意味着您使用的是旧版且不受支持的PostgreSQL版本并且应该升级)。