2016-12-29 12 views
1

WKT文字列を含むテキスト列からジオメトリ列を挿入するINSERT/UPDATEトリガーを作成しています。しかし、今はすべての行を上書きしています!FOR EACH ROWを指定したpostgresqlトリガーは影響を受けない行に影響を与えます。

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... 
:上記のコマンドを実行している
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))'); 

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(); 

はにつながります

ポピュレートされたジオメトリ列には、同じジオメトリが保持されます。これは、トリガされるたびにすべての行に影響を与えると私に信じさせています。しかし、私が読んドキュメントから:

EACH ROWのためにマークされたトリガはcoverage_geomは「RETURN NEW」の後に、実際に永続的である一方で操作が、さらに

を変更することを行ごとに1回呼び出されますNEW.nameは同じ方法で設定することはできません。私はそれが関連しているかわからない。

+1

'new'レコードの値を変更したい場合は、**' BEFORE' **トリガーが必要です。 –

+0

これは素晴らしいです! – Anders

答えて

2

"新しいレコードの値を変更する場合は、" BEFOREトリガーが必要です。 " - a_horse_with_no_nameで指摘されているとおりです。

関連する問題