每行的postgresql触发器影响未受影响的行

每行的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

我正在制作一个插入/更新触发器,以从包含WKT字符串的文本列填充几何列。但是现在它覆盖了所有的行

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...