PostgreSQL可延迟约束触发器引用新过渡表报语法错误排查
解决PostgreSQL约束触发器的语法错误问题
你遇到的语法错误核心是语句顺序不符合PostgreSQL的语法规则:REFERENCING子句的位置放错了,它必须位于DEFERRABLE INITIALLY DEFERRED之后、FOR EACH STATEMENT之前。
另外还有一个逻辑问题:你的触发器包含DELETE事件,但DELETE操作不会生成NEW TABLE(没有新行数据)。如果要处理DELETE,需要同时引用OLD TABLE来获取被删除的行;如果不需要处理DELETE,可以直接从触发事件中移除它。
修正方案1:仅处理INSERT/UPDATE事件
CREATE CONSTRAINT TRIGGER check_rows AFTER INSERT OR UPDATE ON rows DEFERRABLE INITIALLY DEFERRED REFERENCING NEW TABLE AS newtable FOR EACH STATEMENT EXECUTE FUNCTION check_rows();
修正方案2:处理所有INSERT/UPDATE/DELETE事件
CREATE CONSTRAINT TRIGGER check_rows AFTER INSERT OR UPDATE OR DELETE ON rows DEFERRABLE INITIALLY DEFERRED REFERENCING NEW TABLE AS newtable OLD TABLE AS oldtable FOR EACH STATEMENT EXECUTE FUNCTION check_rows();
需要确保你的check_rows()函数能够正确处理过渡表(比如newtable或oldtable)的逻辑,因为语句级触发器的函数会接收整个过渡表作为处理对象,而非单条行数据。
内容的提问来源于stack exchange,提问作者Ali Elkhateeb
相关产品推荐
相关产品推荐

