PostgreSQL 中的 TRIGGER ON VIEW 不会触发
TRIGGER ON VIEW in PostgreSQL doesn't trigger
我正在尝试在 PostgreSQL 9.6 中的 VIEW
上添加触发器。
这是我的观点:
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();
是否可以直接在视图上添加触发器,在该视图中使用的基表发生任何更改时触发?
我认为你误解了视图的概念。
视图不包含任何数据,您可以将其视为具有名称的“结晶 SQL 语句”。每当在查询中使用视图时,它都会在“查询重写”步骤中被其定义替换。
视图上 UPDATE
的 INSTEAD OF
触发器仅在您更新 视图本身 时触发,而不是基础 tables .为此,您必须在 table 上定义触发器。
您可能遗漏的一点是,如果底层 table 发生某些变化,它会立即在视图中发生变化,因为视图只是对基础 table 的查询.
我正在尝试在 PostgreSQL 9.6 中的 VIEW
上添加触发器。
这是我的观点:
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();
是否可以直接在视图上添加触发器,在该视图中使用的基表发生任何更改时触发?
我认为你误解了视图的概念。
视图不包含任何数据,您可以将其视为具有名称的“结晶 SQL 语句”。每当在查询中使用视图时,它都会在“查询重写”步骤中被其定义替换。
视图上 UPDATE
的 INSTEAD OF
触发器仅在您更新 视图本身 时触发,而不是基础 tables .为此,您必须在 table 上定义触发器。
您可能遗漏的一点是,如果底层 table 发生某些变化,它会立即在视图中发生变化,因为视图只是对基础 table 的查询.