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 таким же образом. Я не знаю, связано ли это.
Для того, чтобы изменить значения записи 'new' –
, вам понадобится **' BEFORE' **. – Anders