簡體   English   中英

如何避免在此FOR EACH STATEMENT觸發器中進行無限遞歸?

[英]How can I avoid infinite recursion in this FOR EACH STATEMENT trigger?

我有一個表tbl ,其中有一個dirty: boolean列。 在事務期間,對於某些行,此標志設置為true 然后,我有以下觸發器:

create function tbl_process() returns trigger as
$$ begin
    -- first, do something for all rows with dirty flag set to true
    ...

    -- then, reset the dirty flag
    update tbl set dirty = false where dirty = true;

    return null;
end $$ language plpgsql;

create trigger tbl_process after update on tbl for each statement execute procedure tbl_process();

這里的問題是第二個查詢( update tbl set dirty = false where dirty = true )遞歸調用觸發器。 這一直持續到我們出現堆棧溢出為止。

有辦法避免這種情況嗎? 而且,為什么我們要遞歸? 在第一次迭代中,我們將所有行都標記為dirty = false ,因此,在第二次迭代中,不應存在dirty = true行?

我正在使用PostgreSQL 9.6。

在函數體的開頭添加以下語句

IF pg_trigger_depth() <> 1 THEN
        RETURN NEW;
    END IF;

喜歡

create function tbl_process() returns trigger as
$$ begin
    IF pg_trigger_depth() <> 1 THEN
        RETURN NEW;
    END IF;
    update tbl set dirty = false where dirty = true;

    return null;
end $$ language plpgsql;

您可以在更新之前驗證此字段的NEW值是否為true。 如果將其設置為false,則無需執行任何操作。

但是,為什么要處理設置了該字段的所有記錄? 由於此觸發器,因此只應存在此觸發器,因為最后將其重置。 而且,如果您需要更新當前記錄,則可以通過將NEW.dirty更新為false來正確地進行操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM