使用PostgreSQL规则/触发器进行调试

时间:2011-11-07 04:06:54

标签: spring postgresql transactions rule

我试图支持的应用程序当前遇到了唯一的约束违规。我无法在非生产环境中重现此问题。出于调试目的,创建一个规则(触发器?)是否合理,实际上只是将每个插入复制到另一个表?因此,实际上新表将与没有约束的旧表相同,希望如此。

应用程序使用Spring来管理事务性,我无法找到任何与事务规则相关的文档。在违规之后,在事务中到目前为止所写的内容都会被回滚 - 这会以任何方式影响规则吗? 这是Postgres 8.3。

3 个答案:

答案 0 :(得分:1)

您可以使用规则和触发器执行几乎任何您能想到的事情。然后再说一些。不过,你的确切意图仍然有点不清楚。

如果事务已经回滚,正如您在结尾处提示的那样,那么一切都将被撤消,包括所涉及的任何规则或触发器的所有副作用。你的计划是徒劳的。

有一个解决方法,实际上就是你想要实现的目的:使用dblink链接和INSERT到同一个数据库中的表。那不会回滚。

但是,如果仅用于调试目的,数据库日志是一种更简单的方法,可以查看尚未输入的重复项。默认情况下会记录错误。如果没有,您可以根据需要进行设置。查看您的options in the manual

答案 1 :(得分:1)

  

违规后,到目前为止在交易中写的是   回滚 - 这会以任何方式影响规则吗?

这将回滚规则所做的一切。您可以创建一个使用dblink的触发器,以便在当前事务之外完成一些工作。另一个选项可能是保存点,但是您必须更改所有当前代码和事务。

日志文件中也记录了唯一的违规行为,获取此信息以查看出现了什么问题。 Version 9.0有一个更改,它会告诉您值是什么:

  

改进唯一性约束违规错误消息以报告   导致失败的价值(板垣孝宏)例如,a   唯一性约束违规现在可能已经报告了Key(x)=(2)   存在。

答案 2 :(得分:0)

如前所述,规则不能用于此目的,因为它们仅用于重写查询。但重写的查询就像原始的仍然是交易的一部分。

规则可以用于强制执行使用常规约束无法实现的约束,例如密钥在多个表或其他多表内容中是唯一的。 (这些确实具有“canary”tablename显示在日志和错误消息中的优势)但是OP已经有太多限制,它出现......

似乎也指出了调整序列化级别(是否涉及多个会话?框架是否使用连接池?)