PostgreSQL中查看时的触发器不';t触发器
我试图在PostgreSQL 9.6中的PostgreSQL中查看时的触发器不';t触发器,sql,postgresql,triggers,sql-view,Sql,Postgresql,Triggers,Sql 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 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 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语句”。无论何时在查询中使用视图,都会在“查询重写”步骤中将其替换为其定义
仅当更新视图本身而不是基础表时,才会触发视图上的而不是更新的触发器。为此,您必须在这些表上定义触发器
您可能缺少的一点是,如果基础表中的某些内容发生了更改,则视图中的内容会立即发生更改,因为视图只是基表上的一个查询。插入视图时,会触发而不是触发器,如果插入到一个基表中,则不会这样做……如果我将插入到视图中,这不会破坏视图
和基表
之间的关系,有点取消了视图
的概念?我不清楚这个问题-当你说视图触发器没有触发时,你真的在视图上插入了吗?不,我在一个基表上插入了视图。我同意,这是有意义的。我的目标是能够在视图
上“监听”(某种程度上)其基表中所做的任何更改。而不是在每个单独的基表上,因为这使得在视图
中自动查找它所做的更改更加困难,这正是我所需要的。视图从不更改-它没有内容。有意义,是的。非常感谢。