gpt4 book ai didi

postgresql - 当 View 的内容间接更新时触发器不触发

转载 作者:行者123 更新时间:2023-11-29 13:24:50 25 4
gpt4 key购买 nike

我开始对术语感到有点困惑,我开始相信我希望实现的目标是不可能的。是否可以创建一个触发器,当 View 中的信息发生更改时触发,而不是通过 UPDATE/INSERT/DELETE 语句在 View 本身上,而是在 View 组成的其中一个表上?

如果不是,是否有一种有效的方法来过滤哪些查询将触发触发器?

为了提供更多上下文,我有一个用户表和一个位置表。我只关心某个区域内每个用户的最新位置。我创建了一个 View ,如下所示:

CREATE OR REPLACE VIEW "users_near_coordinate" AS
SELECT DISTINCT ON ("User"."id") "User"."id", "User"."displayName", "UserLocation"."location", "UserLocation"."createdAt"
FROM "User", "UserLocation"
WHERE "UserLocation"."userId" = "User"."id" AND ST_Distance_Sphere(location, ST_MakePoint(long,lat)) <= 5 * 1609.34
ORDER BY "User"."id", "UserLocation"."createdAt" DESC;

然后我有一个触发器,如下:

CREATE OR REPLACE FUNCTION notify_user_moved_within_range() RETURNS trigger AS $$
DECLARE
BEGIN
PERFORM pg_notify('user_nearby_inserted', TG_TABLE_NAME || ':' || NEW);
RETURN new;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER "user_moved_within_range" INSTEAD OF INSERT ON "users_near_coordinate" FOR EACH ROW EXECUTE PROCEDURE notify_user_moved_within_range();

我也尝试过组合使用 AFTER INSERT [...] FOR EACH STATEMENT,但触发器似乎从未被触发。

为了测试,我插入了一个位置:

INSERT INTO "public"."UserLocation"("userId", "scenarioId", "location", "createdAt", "updatedAt") VALUES('8041849f-a204-4511-b6fa-74f3b731fd1f', '1', ST_GeomFromText('POINT(long lat)', 4326), now(), now());

最佳答案

View 只不过是 SQL 宏。它们实际上不包含任何数据,并且在更新基础表时 View 本身没有任何变化。因此,没有 INSERT View 上可能触发触发器的事件;你需要把扳机放在 table 上。

您可以轻松地定义一个有条件触发的触发器,方法是附加 WHEN (<condition>) clause给你的CREATE TRIGGER陈述。或者,您可以将条件逻辑放在触发器函数本身中,即:

IF <condition> THEN
PERFORM pg_notify(...);
END IF;

关于postgresql - 当 View 的内容间接更新时触发器不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35672848/

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