我正在使用pgtap来测试一些延迟约束触发器:
SET CONSTRAINTS ALL IMMEDIATE
这很好用,但它限制了我每次交易的单次测试。如果我稍后尝试设置更多数据,我之前推迟的约束会立即触发。
是否可以恢复SET CONSTRAINTS ALL IMMEDIATE
的影响,而不会恢复它激活的约束的影响?如果没有,我唯一的选择是将每个测试移动到一个单独的文件,这有点麻烦。
答案 0 :(得分:2)
你试过吗
SET CONSTRAINTS ALL DEFERRED
之后 你致电SET CONSTRAINTS ALL IMMEDIATE
?
如果这会推迟比你想要的更多限制,你必须单独命名:
SET CONSTRAINTS my_constraint [, ...] DEFERRED;
它不会还原任何效果。它只推迟进一步的检查。如果违反约束,则引发EXCEPTION
。 可以在这里没有任何回复。
如果这是你想要的,你可以在plpgsql函数中捕获异常。
如果您要将约束恢复到其初始状态,则必须单独SET
它们并使用显式状态。可悲的是 - 据我所知 - PostgreSQL 9.1中没有“重置约束”会使它们全部处于初始状态。