0

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

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

4

3 回答 3

1

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

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

有一种解决方法可以解决这个问题,事实上,这就是您想要实现的目标:使用dblink链接和 INSERT 到同一数据库中的表。那不是回滚。

但是,如果只是出于调试目的,数据库日志是一种更简单的方法来查看哪些重复项没有被输入。默认情况下会记录错误。如果没有,您可以根据需要进行设置。请参阅手册中的选项

于 2011-11-07T06:48:38.200 回答
1

违规之后,到目前为止在事务中写入的任何内容都会回滚 - 这会以任何方式影响规则吗?

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

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

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

于 2011-11-07T06:50:05.403 回答
0

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

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

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

于 2011-11-07T10:19:08.683 回答