簡體   English   中英

帶有FOR EACH ROW的postgresql觸發器影響不受影響的行

[英]postgresql trigger with FOR EACH ROW affect nonaffected rows

我正在執行INSERT / UPDATE觸發器,以從包含WKT字符串的文本列填充幾何列。 但是現在它覆蓋了所有行!

CREATE TABLE public.teams
(
  name text,
  coverage_wkt text,
  coverage_geom geometry(Polygon,4326)
)

CREATE TRIGGER trigger_insert_or_update_on_teams
AFTER INSERT OR UPDATE ON teams
FOR EACH ROW
WHEN (pg_trigger_depth() = 0)
EXECUTE PROCEDURE set_geom_columns();

CREATE FUNCTION set_geom_columns() RETURNS trigger AS $set_geom_columns$
BEGIN
    IF NEW.coverage_wkt IS NOT NULL THEN        
        NEW.name := 'im changed forever';       
        NEW.coverage_geom := ST_GeomFromText(NEW.coverage_wkt,4326);            
    END IF;        
    RETURN NEW;
END; $set_geom_columns$ LANGUAGE plpgsql;

INSERT INTO teams (coverage_wkt) VALUES ('POLYGON((17 59, 19 59, 19 60, 18 60, 17 59))');
INSERT INTO teams (coverage_wkt) VALUES ('POLYGON((18 59, 19 59, 19 60, 18 60, 18 59))');

運行上面的命令將導致:

 name |                 coverage_wkt                 |   coverage_geom
      | POLYGON((17 59, 19 59, 19 60, 18 60, 17 59)) | 010300002...
      | POLYGON((18 59, 19 59, 19 60, 18 60, 18 59)) | 010300002...

填充的幾何列包含相同的幾何:最后一個已插入! 這使我相信每次觸發它都會影響所有行。 但是我從文檔中讀到:

標記為FOR EACH ROW的觸發器將針對該操作修改的每一行調用一次

此外,盡管coverage_geom實際上在“返回新消息”之后是持久的,但我無法以相同的方式設置NEW.name。 我不知道是否相關。

“如要更改新記錄的值,則需要一個BEFORE觸發器–” a_horse_with_no_name指出。

暫無
暫無

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

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