2016-12-29 2 views
1

Im делает триггер INSERT/UPDATE для заполнения столбца геометрии из текстового столбца, содержащего строку WKT. Но теперь его переписывание всех строк!postgresql trigger with 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... 

Заполненный столбец геометрии содержит идентичные геометрии: последний вставлен! Это заставляет меня думать, что он влияет на все строки каждый раз, когда он запускается. Но из документации я прочитал:

триггер, помеченный ДЛЯ КАЖДОЙ ROW вызывается один раз для каждой строки, что операция изменяет

Кроме того, в то время как coverage_geom фактически стойкими после «RETURN NEW» Я не могу установить NEW.name таким же образом. Я не знаю, связано ли это.

+1

Для того, чтобы изменить значения записи 'new' –

+0

, вам понадобится **' BEFORE' **. – Anders

ответ

2

«Вам нужен триггер BEFORE, если вы хотите изменить значения новой записи -« Как указано a_horse_with_no_name.