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は同じ方法で設定することはできません。私はそれが関連しているかわからない。
'new'レコードの値を変更したい場合は、**' BEFORE' **トリガーが必要です。 –
これは素晴らしいです! – Anders