postgresql在物化视图上创建触发器

时间:2014-06-20 09:09:41

标签: sql postgresql view materialized-views triggers

我想在一个引用视图(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();

1 个答案:

答案 0 :(得分:3)

我没有找到任何文档说“你无法在物化视图上创建触发器。”

然而,看起来物化视图不是您需要它的意义上的视图。例如,尝试删除物化视图会引发此错误。

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

我认为这符合当前文档对CREATE TRIGGER所说的内容。

  

表或视图的名称(可选择模式限定)   触发器是为。

请注意,它没有说“表格或视图或物化视图”。

可以为视图编写触发器,该视图执行您首选要使用的外键约束的工作。