gpt4 book ai didi

sql - postgresql 在物化 View 上创建触发器

转载 作者:行者123 更新时间:2023-11-29 12:45:43 24 4
gpt4 key购买 nike

我想在一个引用 View (owoce) 的表中有一个字段 (produkt)。

-- see definition of 'owoce' below
FOREIGN KEY (produkt) REFERENCES owoce(nazwa) ON DELETE RESTRICT

这在 PostgreSQL (9.3) 中是被禁止的,所以我决定改为创建物化 View (在这种情况下它可能更好 - 更快)。据说物化 View 可以像普通表一样使用。

我以前使用的普通 View 有一个修改基础表的触发器(见下文),但是当我将 View 更改为具体化时,我得到了一个错误:

'komplety' is not a table nor view

在 Oracle 中,可以在物化 View 上创建触发器 ( Materialized view with trigger? ),那么 PostgreSQL 9.3 呢?也许有任何其他可能性来制作引用字段以供查看?在这种情况下我更愿意使用标准 View 。

很抱歉在我的代码中混用了多种语言,但我的 GUI 直接使用了表名。

CREATE MATERIALIZED VIEW komplety AS
SELECT nazwa, klient
FROM produkty
WHERE komplet = true;

CREATE OR REPLACE FUNCTION update_view_komplety()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $function$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO produkty(komplet,nazwa,klient,jm) VALUES(true,NEW.nazwa,NEW.klient,'kpl.');
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
UPDATE produkty SET nazwa=NEW.nazwa, klient=NEW.klient WHERE nazwa=OLD.nazwa AND klient=OLD.klient AND komplet=true;
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
DELETE FROM produkty WHERE nazwa=OLD.nazwa AND klient=OLD.klient AND komplet=true;
RETURN NULL;
END IF;
RETURN NEW;
END;
$function$;

CREATE TRIGGER update_view_komplety_trig
INSTEAD OF INSERT OR UPDATE OR DELETE ON
komplety FOR EACH ROW EXECUTE PROCEDURE update_view_komplety();

最佳答案

我没有找到任何说明“您不能在物化 View 上创建触发器”的文档。

然而,物化 View 似乎并不是您所需要的那种 View 。例如,尝试删除实体化 View 会引发此错误。

ERROR:  "komplety" is not a viewHINT:  Use DROP MATERIALIZED VIEW to remove a materialized view.

我认为这与当前文档中关于 CREATE TRIGGER 的内容一致.

The name (optionally schema-qualified) of the table or view the trigger is for.

请注意,它没有说“表或 View 或物化 View ”。

可以为执行您希望使用的外键约束的 View 编写触发器。

关于sql - postgresql 在物化 View 上创建触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24323718/

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