PostgreSQL 中的 TRIGGER ON VIEW 不触发

Alf*_*lle 6 sql database postgresql triggers sql-view

我正在尝试在 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;
Run Code Online (Sandbox Code Playgroud)

这是我的触发函数:

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;
Run Code Online (Sandbox Code Playgroud)

和我的CREATE TRIGGER

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

每当基表之一发生某些情况时,这都不会触发任何更改。然而,创建 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();
Run Code Online (Sandbox Code Playgroud)

是否可以直接在视图上添加触发器,该触发器在该视图中使用的基表发生任何更改时触发?

Lau*_*lbe 2

我认为您误解了视图的概念。

视图不保存任何数据,您可以将其视为有名称的“结晶 SQL 语句”。每当在查询中使用视图时,它就会在“查询重写”步骤中被其定义替换。

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

您可能忽略的一点是,如果基础表中发生某些更改,视图中的更改也会立即发生,因为视图只是基表上的查询。