postgresql触发器与FOR EACH ROW影响不受影响的行
问题描述:
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。我不知道它是否相关。
答
“如果您想要更改新记录的值,您需要一个BEFORE触发器 - ” 正如a_horse_with_no_name所指出的那样。
如果您想更改'new'记录的值,您需要**'BEFORE' **触发器 –
太棒了! – Anders