1

我正在使用 pgtap 通过以下方式测试一些延迟约束触发器:

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

这很好用,但它限制了我对每个事务的单个测试。如果我稍后尝试设置更多数据,我之前的延迟约束现在会立即触发。

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

4

1 回答 1

2

你有没有尝试过

SET CONSTRAINTS ALL DEFERRED

你打电话SET CONSTRAINTS ALL IMMEDIATE

如果这会延迟比您想要的更多的约束,您必须单独命名它们:

SET CONSTRAINTS my_constraint [, ...] DEFERRED;

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

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

如果您想将约束恢复到初始状态,则必须SET单独使用显式状态对它们进行处理。遗憾的是——据我所知——PostgreSQL 9.1 中没有“重置约束”可以将它们全部恢复到初始状态。

手册页。

于 2012-08-03T17:00:54.423 回答