我有一个有'状态'变量的表。状态更改后,将触发更新后触发器。更新后触发器检查状态变量。当达到特定状态时,触发器在另一个表中生成一个条目,然后通过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"
所以会发生什么:
在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),或者在任何具体说我不能这样做的帖子中找不到任何内容 - 或 - 提供备用建议。
谢谢 -
罗伊