0

私は2つのテーブルを持っていtasksますsubtasks. すべてのサブタスクにはステータスがあります (最初に挿入されたときは 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();

これを 1 つのタスクと 4 つのサブタスクでテストすると、trigger_log表に次のように挿入されます。

ID  Pending_count
2        3
1        3
3        3
4        3

さらに、テストが終了すると、すべてのサブタスクは READY 状態になりますが、それらのメイン タスクはまだ PENDING のままです。基本的にトリガーは正しくカウントされません。何か案は?

4

1 に答える 1

0

まず、ここでシリアル化可能なモード (または SELECT ... FOR UPDATE) を使用するという Daniel Vérité の提案に同意したいと思います。

ただし、あなたの質問は詳細が不足しているため、問題ではない可能性があります。確認事項は次のとおりです。

  1. クエリを正常に実行すると、期待どおりに動作しますか? 最初にクエリをトラブルシューティングします。そうでない場合は、その下にあるどのデータが問題を引き起こしているかを調べる必要があります。ステータスに文字列を使用しているように見える場合、これは空白などの非常に微妙な問題である可能性があります。

  2. トリガーは発射されていますか?トリガーに RAISE NOTICE を追加して、実際に起動していることを psql で確認できるようにすることができます。そうでない場合は、その理由を調べる必要があります (無効になっているか、クエリが想定どおりに動作していない可能性があります)。

于 2013-10-28T08:41:03.570 に答える