2016-12-29 124 views
1

Im使用INSERT/UPDATE觸發器從包含WKT字符串的文本列填充幾何列。但現在它覆蓋所有行!postgresql觸發器與FOR EACH ROW影響不受影響的行

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每一行每一行都調用一次的操作修改

另外一個觸發器,而coverage_geom實際上是執着後「迴歸NEW」我無法以同樣的方式設置NEW.name。我不知道它是否相關。

+1

如果您想更改'new'記錄的值,您需要**'BEFORE' **觸發器 –

+0

太棒了! – Anders

回答

2

「如果您想要更改新記錄的值,您需要一個BEFORE觸發器 - 」 正如a_horse_with_no_name所指出的那樣。