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

时间:2012-08-03 15:40:54

标签: postgresql

我正在使用pgtap来测试一些延迟约束触发器:

  • 开立交易
  • 插入一些测试数据
  • 执行一些陈述
  • 使用SET CONSTRAINTS ALL IMMEDIATE
  • 模拟提交
  • 测试提交后条件

这很好用,但它限制了我每次交易的单次测试。如果我稍后尝试设置更多数据,我之前推迟的约束会立即触发。

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

1 个答案:

答案 0 :(得分:2)

你试过吗

SET CONSTRAINTS ALL DEFERRED
之后

你致电SET CONSTRAINTS ALL IMMEDIATE

如果这会推迟比你想要的更多限制,你必须单独命名:

SET CONSTRAINTS my_constraint [, ...] DEFERRED;

它不会还原任何效果。它只推迟进一步的检查。如果违反约束,则引发EXCEPTION可以在这里没有任何回复。

如果这是你想要的,你可以在plpgsql函数中捕获异常。

如果您要将约束恢复到其初始状态,则必须单独SET它们并使用显式状态。可悲的是 - 据我所知 - PostgreSQL 9.1中没有“重置约束”会使它们全部处于初始状态。

Manual page.