每行的postgresql触发器影响未受影响的行
我正在制作一个插入/更新触发器,以从包含WKT字符串的文本列填充几何列。但是现在它覆盖了所有的行每行的postgresql触发器影响未受影响的行,postgresql,triggers,Postgresql,Triggers,我正在制作一个插入/更新触发器,以从包含WKT字符串的文本列填充几何列。但是现在它覆盖了所有的行 CREATE TABLE public.teams ( name text, coverage_wkt text, coverage_geom geometry(Polygon,4326) ) 运行上述命令将导致: name | coverage_wkt | coverage_geom | POLY
CREATE TABLE public.teams
(
name text,
coverage_wkt text,
coverage_geom geometry(Polygon,4326)
)
运行上述命令将导致:
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...
填充的几何图形列包含相同的几何图形:最后一个插入的几何图形!这让我相信每次触发时它都会影响所有行。但从我读到的文件中:
为每一行标记的触发器将为操作修改的每一行调用一次
此外,虽然coverage_geom在“returnnew”之后实际上是持久的,但我不能以相同的方式设置NEW.name。我不知道它是否相关。“如果要更改新记录的值,需要一个BEFORE触发器–”
正如一匹没有名字的马所指出的那样。如果你想更改新记录的值,你需要在触发器之前设置
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...