PostgreSQL 11 新特性之分区表行级触发器

作者: 不剪发的Tony老师
毕业于北京航空航天大学,十多年数据库管理与开发经验,目前在一家全球性的金融公司从事数据库架构设计。CSDN学院签约讲师以及GitChat专栏作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net

文章目录

PosgtreSQL 11 支持分区表上的 FOR EACH ROW 触发器。目前,只能创建 AFTER 触发器,还不支持 BEFORE 触发器。另外,定义触发器时不能指定 WHEN 子句,也就是不能指定触发条件。

首先创建一个分区表和分区:

CREATE TABLE rtable(c1 INT, c2 VARCHAR(10)) PARTITION BY RANGE(c1);
CREATE TABLE rtable100 PARTITION OF rtable FOR VALUES FROM (1) TO (100);

接下来为 rtable 表创建一个行级触发器:

CREATE OR REPLACE FUNCTION rtable_insert_func()
RETURNS TRIGGER AS


LANGUAGE plpgsql;

CREATE TRIGGER rtable_insert_trigger
    AFTER INSERT ON rtable
    FOR EACH ROW EXECUTE FUNCTION rtable_insert_func();

分区表上创建的触发器也会自动为已有的分区和将来添加的分区自动创建相应的触发器。

\d rtable
                      Table "public.rtable"
 Column |         Type          | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
 c1     | integer               |           |          |
 c2     | character varying(10) |           |          |
Partition key: RANGE (c1)
Triggers:
    rtable_insert_trigger AFTER INSERT ON rtable FOR EACH ROW EXECUTE PROCEDURE rtable_insert_func()
Number of partitions: 1 (Use \d+ to list them.)

\d rtable100
                    Table "public.rtable100"
 Column |         Type          | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
 c1     | integer               |           |          |
 c2     | character varying(10) |           |          |
Partition of: rtable FOR VALUES FROM (1) TO (100)
Triggers:
    rtable_insert_trigger AFTER INSERT ON rtable100 FOR EACH ROW EXECUTE PROCEDURE rtable_insert_func()

插入一条数据,查看触发器的执行情况:

insert into rtable(c1, c2) VALUES(10, 'val10');
INFO:  INSERT TRIGGER ON rtable100
INFO:  INSERT VALUES: c1=10; c2=val10
INSERT 0 1

需要注意的是,分区表 FOR EACH ROW 触发器执行的时候,TG_TABLE_NAME 变量的值是数据所在分区的名称(rtable100),而不是分区表的名称(rtable)。

对于分区表上的各种触发器,执行顺序如下:


 

 

 

 

 

 

另外,基于这种 AFTER 行级触发器,分区表还支持延迟的唯一约束。

官方文档:Table Partitioning