有没有办法让父表上的触发器也监听 Postgres 中的所有子表?

Posted

技术标签:

【中文标题】有没有办法让父表上的触发器也监听 Postgres 中的所有子表?【英文标题】:Is there a way that a trigger on parent table will also listen to all child tables in Postgres? 【发布时间】:2016-07-06 20:04:53 【问题描述】:

每个客户都有一个父表和 800 多个子表。我想为每个人创建相同的触发器。有没有办法直接为父表创建,每个子表都会监听?

我可以编写一个脚本来为每个客户表创建相同的,但我专门寻找任何直接的解决方案。

【问题讨论】:

【参考方案1】:

如果您使用 inherit,那么您为主表创建触发器,并且更改发生在子表上。

这是一个插入触发器的例子,你可以看到我只在主表avl上插入更新或删除。

CREATE OR REPLACE FUNCTION avl_db.avl_insert_trigger()
  RETURNS trigger AS
$BODY$
BEGIN
    IF ( NEW.event_time >= '2017-06-01 00:00:00' AND NEW.event_time < '2017-06-02 00:00:00' ) THEN 
        INSERT INTO avl_db.avl_20170601 VALUES (NEW.*);
    ELSEIF ( NEW.event_time >= '2017-06-02 00:00:00' AND NEW.event_time < '2017-06-03 00:00:00' ) THEN 
        INSERT INTO avl_db.avl_20170602 VALUES (NEW.*);
    ELSEIF ( NEW.event_time >= '2017-06-03 00:00:00' AND NEW.event_time < '2017-06-04 00:00:00' ) THEN 
        INSERT INTO avl_db.avl_20170603 VALUES (NEW.*);
    ELSEIF ( NEW.event_time >= '2017-06-04 00:00:00' AND NEW.event_time < '2017-06-05 00:00:00' ) THEN 
        INSERT INTO avl_db.avl_20170604 VALUES (NEW.*);
    ELSEIF ( NEW.event_time >= '2017-06-05 00:00:00' AND NEW.event_time < '2017-06-06 00:00:00' ) THEN 
        INSERT INTO avl_db.avl_20170605 VALUES (NEW.*);
....
    ELSE
        RAISE EXCEPTION 'Date out of range.';
    END IF;

    RETURN NULL; -- avoid insert in the main table

关于我刚刚制作的question 的更多详细信息

【讨论】:

以上是关于有没有办法让父表上的触发器也监听 Postgres 中的所有子表?的主要内容,如果未能解决你的问题,请参考以下文章

已解决 - ReactJS - 父表上的行选择崩溃嵌套表

特定表上的 Postgres 复制。

从 Postgres 链接到 Access 2010 的表上的字段不会变成备忘录?

如何合并表上的行并更新 postgres 上的联结表

Postgres 规范化表上的行级安全性

确定表是不是受任何触发器影响