设置SET CONSTRAINTS ALL IMMEDIATE后是否可以恢复延迟约束?
问题描述:
我使用pgtap测试一些延迟约束触发方式:设置SET CONSTRAINTS ALL IMMEDIATE后是否可以恢复延迟约束?
- 打开交易
- 插入一些测试数据
- 执行某些语句
- 模拟提交使用
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中没有“RESET CONSTRAINTS”,它们将会使它们都处于初始状态。
你的意思是'SET CONSTRAINTS ALL IMMEDIATE'? – 2012-08-03 15:47:37
是的,我确实,谢谢 - 我编辑了我的问题。对于那个很抱歉! – ocharles 2012-08-03 15:49:27