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

问题描述:

我使用pgtap测试一些延迟约束触发方式:设置SET CONSTRAINTS ALL IMMEDIATE后是否可以恢复延迟约束?

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

这工作正常,但它将我限制为每次交易的单个测试。如果我稍后尝试设置更多数据,则以前延迟的约束现在立即激活。

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

+0

你的意思是'SET CONSTRAINTS ALL IMMEDIATE'? – 2012-08-03 15:47:37

+0

是的,我确实,谢谢 - 我编辑了我的问题。对于那个很抱歉! – ocharles 2012-08-03 15:49:27

你试过

SET CONSTRAINTS ALL DEFERRED 

后打电话SET CONSTRAINTS ALL IMMEDIATE

如果将推迟更多的约束比你想,你就必须单独为它们命名:

SET CONSTRAINTS my_constraint [, ...] DEFERRED; 

它不会回复任何影响。它只是推迟进一步检查。如果违反约束,则引发EXCEPTION。没有什么可以这里恢复。

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

如果你想将约束恢复到它们的初始状态,你必须单独使用SET这些显式状态。令人遗憾的是 - 就我所知,PostgreSQL 9.1中没有“RESET CONSTRAINTS”,它们将会使它们都处于初始状态。

Manual page.

+0

违反约束条件很好,那会使测试失败。只是做一个彻底的'所有延迟'的问题感觉像我冒着把自己置于一个不代表交易开始的状态,这不是很理想。 – ocharles 2012-08-03 17:55:01

+0

在这种情况下,您必须单独设置'SET'参数。令人遗憾的是 - 据我所知,没有任何“RESET约束条件”会使它们都处于初始状态。 – 2012-08-03 18:34:07

+0

我也是这么想的。我接受了你的回答,基于这个评论,也许你想添加到答案的实际正文? – ocharles 2012-08-05 13:28:20