TRIGGER ON VIEW в PostgreSQL не запускается - PullRequest
2 голосов
/ 03 апреля 2019

Я пытаюсь добавить триггер на VIEW в PostgreSQL 9.6.

Это мой взгляд:

CREATE VIEW names AS
SELECT one.name AS name_one, two.name AS name_two, three.name AS name_three
FROM table_one one
LEFT JOIN table_two two ON one.id = two.id
LEFT JOIN table_three three ON two.id = three.id;

Это моя функция триггера:

CREATE OR REPLACE FUNCTION notify_name_changed() RETURNS trigger AS $BODY$
  BEGIN
    PERFORM pg_notify('name_changed', row_to_json(NEW)::text);
    RETURN NULL;
  END; 
$BODY$ LANGUAGE plpgsql;

И мой CREATE TRIGGER:

CREATE TRIGGER notify_name_changed INSTEAD OF INSERT OR UPDATE OR DELETE ON "names"
  FOR EACH ROW EXECUTE PROCEDURE notify_name_changed();

Это не вызывает никаких изменений, когда что-то происходит в одной из базовых таблиц.Однако создание 3-х отдельных триггеров делает, но несколько не связано с представлением:

CREATE TRIGGER notify_name_changed AFTER INSERT OR UPDATE OR DELETE ON "one"
  FOR EACH ROW EXECUTE PROCEDURE notify_name_changed();

CREATE TRIGGER notify_name_changed AFTER INSERT OR UPDATE OR DELETE ON "two"
  FOR EACH ROW EXECUTE PROCEDURE notify_name_changed();

CREATE TRIGGER notify_name_changed AFTER INSERT OR UPDATE OR DELETE ON "three"
  FOR EACH ROW EXECUTE PROCEDURE notify_name_changed();

Разве нельзя добавить триггер непосредственно в представление, которое срабатывает в случае каких-либо изменений в базовых таблицахиспользуется в этом представлении?

1 Ответ

1 голос
/ 03 апреля 2019

Я думаю, вы неправильно понимаете концепцию представления.

Представление не содержит никаких данных, вы можете видеть его как & ldquo; оператор SQL с кристаллизованными данными & rdquo; у этого есть имя. Всякий раз, когда представление используется в запросе, оно заменяется его определением в & ldquo; перезапись запроса & rdquo; шаг.

Триггер INSTEAD OF для UPDATE в представлении срабатывает, только если вы обновляете само представление , а не базовые таблицы. Для этого вам нужно определить триггеры для этих таблиц.

Смысл, который вы, вероятно, упускаете, заключается в том, что если что-то изменяется в базовых таблицах, оно немедленно изменяется в представлении, поскольку представление - это просто запрос к базовой таблице.

...