使用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();
有什么想法吗?
答案 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
是默认。
大胆强调我的。并且您无法在语句级触发器中引用NEW
或OLD
,这会使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版本并且应该升级)。