我正在使用 pgtap 通过以下方式测试一些延迟约束触发器:
- 开启交易
- 插入一些测试数据
- 执行一些语句
- 通过使用模拟提交
SET CONSTRAINTS ALL IMMEDIATE
- 测试提交后条件
这很好用,但它限制了我对每个事务的单个测试。如果我稍后尝试设置更多数据,我之前的延迟约束现在会立即触发。
是否可以恢复 的影响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
则引发 an。这里没有什么可以恢复的。
如果这是您想要的,您可以在 plpgsql 函数中捕获异常。
如果您想将约束恢复到初始状态,则必须SET
单独使用显式状态对它们进行处理。遗憾的是——据我所知——PostgreSQL 9.1 中没有“重置约束”可以将它们全部恢复到初始状态。