[英]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.