Trigger

更新列的觸發函式

  • March 30, 2018

我是 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這裡沒有。)

但實際上,我會使用Evan 建議VIEW.

至於您的評論,如果 QGIS 以某種方式與可更新視圖的自動功能相混淆(就像您在 gis.SE 的相關問題中所述),請繼續直接寫入表格。VIEW僅在這種情況下用於表示,以顯示附加的、功能相關的列。

引用自:https://dba.stackexchange.com/questions/202651