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