Trigger
更新列的觸發函式
我是 PL/pgSQL 的新手……我使用 Postgres 9.5.0,每次插入新記錄時都需要更新一列。該欄應根據在
area_pol
和中輸入的值填寫area_ofi
。我正在嘗試創建此功能以適合我的情況:
CREATE OR REPLACE FUNCTION sch_cap.fc_atualiza_dif_area() RETURNS trigger AS $$ BEGIN UPDATE sch_cap.tbl_cap SET dif_area = abs(100 - (tbl_cap.area_pol / (tbl_cap.area_ofi * 100))); END; $$ LANGUAGE plpgsql; CREATE TRIGGER tg_atualiza_dif_area BEFORE INSERT OR UPDATE ON sch_cap.tbl_cap FOR EACH ROW EXECUTE PROCEDURE sch_cap.fc_atualiza_dif_area();
但是當我嘗試插入一條記錄時,出現以下錯誤:
錯誤:超出堆棧深度限制
提示:在確保平台的堆棧深度限制足夠之後,增加配置參數“max_stack_depth”(目前為 2048kB)。
如何正確處理?
每次插入新記錄時都需要更新一列
您的描述與觸發器定義相矛盾
BEFORE INSERT OR UPDATE
。要麼只是,要麼BEFORE INSERT
描述是錯誤的。接下來,您的整個觸發功能是一個誤解。只是:
CREATE OR REPLACE FUNCTION sch_cap.fc_atualiza_dif_area() RETURNS trigger AS $func$ BEGIN NEW.dif_area := abs(100 - (NEW.area_pol / (NEW.area_ofi * 100))); END $func$ LANGUAGE plpgsql;
只需在插入行之前分配所需的值。(
SET
這裡沒有。)至於您的評論,如果 QGIS 以某種方式與可更新視圖的自動功能相混淆(就像您在 gis.SE 的相關問題中所述),請繼續直接寫入表格。
VIEW
僅在這種情況下用於表示,以顯示附加的、功能相關的列。