PostgreSQL 11 新特性之分區(qū)表行級觸發(fā)器

作者: 不剪發(fā)的Tony老師
畢業(yè)于北京航空航天大學(xué),十多年數(shù)據(jù)庫管理與開發(fā)經(jīng)驗(yàn),目前在一家全球性的金融公司從事數(shù)據(jù)庫架構(gòu)設(shè)計(jì)。CSDN學(xué)院簽約講師以及GitChat專欄作者。csdn上的博客收藏于以下地址:https://tonydong.blog.csdn.net

文章目錄

PosgtreSQL 11 支持分區(qū)表上的 FOR EACH ROW 觸發(fā)器。目前,只能創(chuàng)建 AFTER 觸發(fā)器,還不支持 BEFORE 觸發(fā)器。另外,定義觸發(fā)器時不能指定 WHEN 子句,也就是不能指定觸發(fā)條件。

首先創(chuàng)建一個分區(qū)表和分區(qū):

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 表創(chuàng)建一個行級觸發(fā)器:

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();

分區(qū)表上創(chuàng)建的觸發(fā)器也會自動為已有的分區(qū)和將來添加的分區(qū)自動創(chuàng)建相應(yīng)的觸發(fā)器。

\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()

插入一條數(shù)據(jù),查看觸發(fā)器的執(zhí)行情況:

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

需要注意的是,分區(qū)表 FOR EACH ROW 觸發(fā)器執(zhí)行的時候,TG_TABLE_NAME 變量的值是數(shù)據(jù)所在分區(qū)的名稱(rtable100),而不是分區(qū)表的名稱(rtable)。

對于分區(qū)表上的各種觸發(fā)器,執(zhí)行順序如下:


 

 

 

 

 

 

另外,基于這種 AFTER 行級觸發(fā)器,分區(qū)表還支持延遲的唯一約束。

官方文檔:Table Partitioning