触发不正确后的SQL

时间:2013-06-18 07:43:36

标签: sql postgresql triggers

我有两个表,taskssubtasks。每个子任务都有一个状态(首次插入时为PENDING)。然后我运行更新每个子任务的线程(状态变为READY)。我想要的是当给定任务的每个子任务变为READY时,他们的父任务也准备就绪。这是我写的触发器:

CREATE FUNCTION update_task_status() RETURNS trigger AS $$
    BEGIN
      INSERT INTO trigger_log SELECT NEW.subtask_id, COUNT(fo_id) FROM subtasks WHERE fo_id = NEW.fo_id AND status <> 'READY';

      UPDATE tasks
         SET status = 'READY'
       WHERE task_id = NEW.fo_id
         AND NOT EXISTS (
             SELECT 1
               FROM subtasks
              WHERE fo_id = NEW.fo_id
                AND status <> 'READY'
             );
      RETURN NULL;
    END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER update_task AFTER INSERT OR UPDATE ON subtasks
FOR EACH ROW EXECUTE PROCEDURE update_task_status();

当我使用一个任务和4个子任务测试时,这是trigger_log表中插入的内容:

ID  Pending_count
2        3
1        3
3        3
4        3

最重要的是,在测试完成后,所有子任务都处于READY状态,但它们的主要任务仍然是PENDING。基本上触发器不能正确计数。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,我想提出DanielVérité的建议,在这里使用可序列化模式(或SELECT ... FOR UPDATE)。

但是,您的问题在细节上很短,因此可能不是问题。以下是要检查的事项:

  1. 如果您正常运行查询,它会按预期执行吗?首先解决您的疑问。如果没有,那么你需要找出下面的数据导致问题。鉴于您似乎使用字符串作为状态,这可能是一个非常微妙的问题,例如,空格。

  2. 触发器被触发了吗?您可以在触发器中添加RAISE NOTICE,以确保您在psql中看到它实际正在触发。如果没有,你需要找出原因(可能是禁用了,或者你的查询没有做你认为它正在做的事情)。