gpt4 book ai didi

sql - PostgreSQL 中的 TRIGGER ON VIEW 不会触发

转载 作者:行者123 更新时间:2023-11-29 12:15:47 27 4
gpt4 key购买 nike

我正在尝试在 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 个单独的触发器确实如此,但与 View 有些无关:

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();

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

最佳答案

我认为您误解了 View 的概念。

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

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

您可能忽略的一点是,如果基础表发生变化,它会立即在 View 中发生变化,因为 View 只是对基表的查询。

关于sql - PostgreSQL 中的 TRIGGER ON VIEW 不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55490296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com