【问题标题】:Using PostgreSQL Rules/Triggers for debugging purposes使用 PostgreSQL 规则/触发器进行调试
【发布时间】:2011-11-07 04:06:53
【问题描述】:

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

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

【问题讨论】:

  • 我从来没有这样做过,但看起来是个好计划

标签: spring postgresql transactions rule


【解决方案1】:

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

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

独特的违规行为也会记录在日志文件中,获取此信息以查看问题所在。 Version 9.0 有一个变化,它也会告诉你这些值是什么:

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

【讨论】:

  • @ryan 得到了立体声建议。 :D 我们提出了几乎相同的观点。也有点让人放心。
【解决方案2】:

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

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

有一个解决方法,如果这实际上是您想要实现的:使用dblink 链接并插入到同一数据库中的表。这没有回滚。

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

【讨论】:

  • RAISE NOTICE 在这种情况下被严重低估了。
【解决方案3】:

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

规则可以用于强制使用常规约束无法实现的约束,例如在多个表中唯一的键或其他多表内容。 (这些确实具有显示在日志和错误消息中的“金丝雀”表名的优势)但是 OP 已经有太多的约束,看来...

似乎还需要调整序列化级别(是否涉及多个会话?框架是否使用连接池?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2019-06-14
    • 2015-02-03
    相关资源
    最近更新 更多