Postgres:AFTER触发似乎阻止更新操作

时间:2016-01-20 21:23:49

标签: postgresql triggers

我有一个有'状态'变量的表。状态更改后,将触发更新后触发器。更新后触发器检查状态变量。当达到特定状态时,触发器在另一个表中生成一个条目,然后通过sql update更新状态。对于问责制,我们有一种监控状态变化的方法(它相当复杂,但工作正常。它将表条目复制到历史表中,它也由触发器驱动)因此,初始表包含:

Table dummy:
   version: 0
   state: draft

在Java应用程序中,SQL会将状态提升为“等待”,并通过执行以下操作来增加版本号:

UPDATE dummy SET version = 1, state = 'waiting'

After触发器由:

创建
CREATE TRIGGER dummy_update AFTER UPDATE ON dummy FOR EACH ROW EXECUTE PROCEDURE check_state();

check_state()是一个python函数。它检查TD [new] [state]的值, 如果TD [new] [state]是'waiting',则在process_queue表中输入一个条目,然后更新虚拟表,将状态设置为'in_queue'并将1加到序列中。

伪代码看起来像:

def check_state() :
   if (TD["new"]["state"] == 'waiting') :
      insert into queue an entry for this row
      update dummy SET state = 'in_queue'
   return "OK"

所以会发生什么:

  1. 初始插页很好。
  2. 状态更新在事务中提交,隔离级别为默认值。触发后触发,TD [新] [状态]被打印,并且正在按预期“等待”。
  3. 存储过程
  4. 在队列中生成一个条目
  5. 发布更新以推进州
  6. 在postgres日志中未检测到错误。 (日志记录级别设置为debug1)。虚拟表只显示2条记录 - 除非我们使用调试器逐步执行Java代码。

    如果它在调试器中运行NOT,我们在输出中得到2条记录,显示draft和in_queue的状态。如果我们使用调试器,我们在输出中得到3条记录,显示draft,waiting和in_queue的状态。后者是理想的结果。

    所以:

    我是否可以在AFTER触发器中执行任何操作以确保将具有“waiting”状态的记录写入数据库表?

    我在其中一篇帖子中看到一个小小的模糊,表明无法在由同一个表上的SQL处理的表上进行After Update。 IE,如果对dummy进行更新(在这种情况下),AFTER SQL也不能对dummy进行更新。现在我在POSTGRES手册中找不到任何内容(我正在运行9.3.5),或者在任何具体说我不能这样做的帖子中找不到任何内容 - 或 - 提供备用建议。

    谢谢 -

    罗伊

0 个答案:

没有答案