Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL中查看时的触发器不';t触发器_Sql_Postgresql_Triggers_Sql View - Fatal编程技术网

PostgreSQL中查看时的触发器不';t触发器

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; 这是我的

我试图在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 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语句”。无论何时在查询中使用视图,都会在“查询重写”步骤中将其替换为其定义

仅当更新视图本身而不是基础表时,才会触发视图上的
而不是
更新的
触发器。为此,您必须在这些表上定义触发器


您可能缺少的一点是,如果基础表中的某些内容发生了更改,则视图中的内容会立即发生更改,因为视图只是基表上的一个查询。

插入视图时,会触发
而不是
触发器,如果插入到一个基表中,则不会这样做……如果我将
插入到
视图中,这不会破坏
视图
基表
之间的关系,有点取消了
视图
的概念?我不清楚这个问题-当你说视图触发器没有触发时,你真的在视图上插入了吗?不,我在一个基表上插入了
视图。我同意,这是有意义的。我的目标是能够在
视图
上“监听”(某种程度上)其基表中所做的任何更改。而不是在每个单独的基表上,因为这使得在
视图
中自动查找它所做的更改更加困难,这正是我所需要的。视图从不更改-它没有内容。有意义,是的。非常感谢。