我想在一个引用视图(owoce)的表中有一个字段(produkt)。
-- see definition of 'owoce' below
FOREIGN KEY (produkt) REFERENCES owoce(nazwa) ON DELETE RESTRICT
它在PostgreSQL(9.3)中是被禁止的,所以我决定创建物化视图(它可能更好 - 在这种情况下更快 - )。它说物化视图可以用作普通表。
我之前使用的普通视图有一个修改基础表的触发器(见下文),但当我将视图更改为物化时出现错误:
' komplety'不是表格也不是视图
在Oracle中,可以在物化视图上创建触发器(Materialized view with trigger?),以及PostgreSQL 9.3怎么样? 也许是否有其他可能使参考字段可供查看?我更喜欢在这种情况下使用标准视图。
很抱歉我的代码中混合了语言,但我的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();
答案 0 :(得分:3)
我没有找到任何文档说“你无法在物化视图上创建触发器。”
然而,看起来物化视图不是您需要它的意义上的视图。例如,尝试删除物化视图会引发此错误。
ERROR: "komplety" is not a view HINT: Use DROP MATERIALIZED VIEW to remove a materialized view.
我认为这符合当前文档对CREATE TRIGGER所说的内容。
表或视图的名称(可选择模式限定) 触发器是为。
请注意,它没有说“表格或视图或物化视图”。
您可以为视图编写触发器,该视图执行您首选要使用的外键约束的工作。