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

标签 sql postgresql view materialized-views triggers

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

相关文章:

mysql - 如何在 MySQL 中生成一组整数

mysql - Sql 查询 Join/Where 3 个表

python - 使用 psycopg2 执行大型查询

sql - 按多列分组并将结果作为单独列中的数组

mysql - 连接列上的 SQL 过滤器查询

sql - azure web应用程序和azure sql数据库之间的高延迟

ruby - 我对 ruby​​/gem 管理和 postgres libpq 有疑问

Android 相对布局中心水平与另一个 View

java - 我在缩放使用 View 的基于H2的Java应用程序时遇到问题

Django 模板上下文多个 View