是否可以在设置SET constraints ALL IMMEDIATE后恢复延迟约束



我使用pgtap通过以下方式测试一些延迟约束触发器:

  • 打开交易
  • 插入一些测试数据
  • 执行某些语句
  • 使用SET CONSTRAINTS ALL IMMEDIATE模拟提交
  • 测试提交后条件

这很好用,但它限制了我每次事务只能进行一次测试。如果我稍后尝试设置更多数据,我以前推迟的约束现在会立即启动。

是否可以恢复SET CONSTRAINTS ALL IMMEDIATE的影响,而不恢复其导致激活的约束的影响?如果没有,我唯一的选择是将每个测试移到一个单独的文件中,这有点麻烦。

你试过吗

SET CONSTRAINTS ALL DEFERRED

之后,是否调用SET CONSTRAINTS ALL IMMEDIATE

如果这会推迟比你想要的更多的约束,你必须单独命名它们:

SET CONSTRAINTS my_constraint [, ...] DEFERRED;

它不会恢复任何效果。它只会推迟进一步的检查。如果违反了约束,则会引发EXCEPTION。此处没有任何可以还原的内容。

如果您想要的话,您可以在plpgsql函数中捕获异常。

如果您想将约束恢复到其初始状态,则必须单独使用显式状态SET约束。遗憾的是,据我所知,PostgreSQL 9.1中没有"重置约束"可以将它们全部恢复到初始状态。

手册页面。

最新更新