我希望在一个表中有一个引用 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 view HINT: 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/