概述PosgtreSQL 11 支持
分区表上的 FOR EACH ROW
触发器。目前,只能创建 AFTER 触发器,还不支持 BEFORE 触发器。另外,定义触发器时不能指定 WHEN 子句,也就是不能指定触发条件。
文章目录
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 $$BEGIN RAISE INFO 'INSERT TRIGGER ON %', TG_table_name; RAISE INFO 'INSERT VALUES: c1=%; c2=%', NEW.c1, NEW.c2; RETURN NulL;END;$$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 rtable100INFO: INSERT VALUES: c1=10; c2=val10INSERT 0 1
需要注意的是,分区表 FOR EACH ROW 触发器执行的时候,TG_table_name 变量的值是数据所在分区的名称(rtable100),而不是分区表的名称(rtable)。
对于分区表上的各种触发器,执行顺序如下:
表1 简单 INSERT 语句
@H_287_403@顺序@H_72_404@@H_287_403@目标表@H_72_404@@H_287_403@TG_WHEN@H_72_404@@H_287_403@TG_OP@H_72_404@@H_287_403@TG_LEVEL@H_72_404@@H_287_403@TG_table_name@H_72_404@
@H_841_419@1@H_841_419@分区表@H_841_419@BEFORE@H_841_419@INSERT@H_841_419@STATEMENT@H_841_419@分区表
@H_841_419@2@H_841_419@分区@H_841_419@BEFORE@H_841_419@INSERT@H_841_419@ROW@H_841_419@分区
@H_841_419@3@H_841_419@分区表@H_841_419@AFTER@H_841_419@INSERT@H_841_419@ROW@H_841_419@分区
@H_841_419@4@H_841_419@分区@H_841_419@AFTER@H_841_419@INSERT@H_841_419@ROW@H_841_419@分区
@H_841_419@5@H_841_419@分区表@H_841_419@AFTER@H_841_419@INSERT@H_841_419@STATEMENT@H_841_419@分区表
表 2 简单 UPDATE 语句(不存在跨分区移动数据)
@H_287_403@顺序@H_72_404@@H_287_403@目标表@H_72_404@@H_287_403@TG_WHEN@H_72_404@@H_287_403@TG_OP@H_72_404@@H_287_403@TG_LEVEL@H_72_404@@H_287_403@TG_table_name@H_72_404@
@H_841_419@1@H_841_419@分区表@H_841_419@BEFORE@H_841_419@UPDATE@H_841_419@STATEMENT@H_841_419@分区表
@H_841_419@2@H_841_419@分区@H_841_419@BEFORE@H_841_419@UPDATE@H_841_419@ROW@H_841_419@分区
@H_841_419@3@H_841_419@分区表@H_841_419@AFTER@H_841_419@UPDATE@H_841_419@ROW@H_841_419@分区
@H_841_419@4@H_841_419@分区@H_841_419@AFTER@H_841_419@UPDATE@H_841_419@ROW@H_841_419@分区
@H_841_419@5@H_841_419@分区表@H_841_419@AFTER@H_841_419@UPDATE@H_841_419@STATEMENT@H_841_419@分区表
表 3 简单 DELETE 语句
@H_287_403@顺序@H_72_404@@H_287_403@目标表@H_72_404@@H_287_403@TG_WHEN@H_72_404@@H_287_403@TG_OP@H_72_404@@H_287_403@TG_LEVEL@H_72_404@@H_287_403@TG_table_name@H_72_404@
@H_841_419@1@H_841_419@分区表@H_841_419@BEFORE@H_841_419@DELETE@H_841_419@STATEMENT@H_841_419@分区表
@H_841_419@2@H_841_419@分区@H_841_419@BEFORE@H_841_419@DELETE@H_841_419@ROW@H_841_419@分区
@H_841_419@3@H_841_419@分区表@H_841_419@AFTER@H_841_419@DELETE@H_841_419@ROW@H_841_419@分区
@H_841_419@4@H_841_419@分区@H_841_419@AFTER@H_841_419@DELETE@H_841_419@ROW@H_841_419@分区
@H_841_419@5@H_841_419@分区表@H_841_419@AFTER@H_841_419@DELETE@H_841_419@STATEMENT@H_841_419@分区表
表 4 TruncATE 语句
@H_287_403@顺序@H_72_404@@H_287_403@目标表@H_72_404@@H_287_403@TG_WHEN@H_72_404@@H_287_403@TG_OP@H_72_404@@H_287_403@TG_LEVEL@H_72_404@@H_287_403@TG_table_name@H_72_404@
@H_841_419@1@H_841_419@分区表@H_841_419@BEFORE@H_841_419@TruncATE@H_841_419@STATEMENT@H_841_419@分区表
@H_841_419@2@H_841_419@分区@H_841_419@BEFORE@H_841_419@TruncATE@H_841_419@STATEMENT@H_841_419@分区
@H_841_419@3@H_841_419@分区表@H_841_419@AFTER@H_841_419@TruncATE@H_841_419@STATEMENT@H_841_419@分区表
@H_841_419@4@H_841_419@分区@H_841_419@BEFORE@H_841_419@TruncATE@H_841_419@STATEMENT@H_841_419@分区表
表 5 跨分区移动数据的 UPDATE 语句
@H_287_403@顺序@H_72_404@@H_287_403@目标表@H_72_404@@H_287_403@TG_WHEN@H_72_404@@H_287_403@TG_OP@H_72_404@@H_287_403@TG_LEVEL@H_72_404@@H_287_403@TG_table_name@H_72_404@
@H_841_419@1@H_841_419@分区表@H_841_419@BEFORE@H_841_419@UPDATE@H_841_419@STATEMENT@H_841_419@分区表
@H_841_419@2@H_841_419@源分区@H_841_419@BEFORE@H_841_419@UPDATE@H_841_419@ROW@H_841_419@源分区
@H_841_419@3@H_841_419@源分区@H_841_419@BEFORE@H_841_419@DELETE@H_841_419@ROW@H_841_419@源分区
@H_841_419@4@H_841_419@目标分区@H_841_419@BEFORE@H_841_419@INSERT@H_841_419@ROW@H_841_419@目标分区
@H_841_419@5@H_841_419@分区表@H_841_419@AFTER@H_841_419@DELETE@H_841_419@ROW@H_841_419@源分区表
@H_841_419@6@H_841_419@源分区@H_841_419@AFTER@H_841_419@DELETE@H_841_419@ROW@H_841_419@源分区
@H_841_419@7@H_841_419@分区表@H_841_419@AFTER@H_841_419@INSERT@H_841_419@ROW@H_841_419@目标分区
@H_841_419@8@H_841_419@目标分区@H_841_419@AFTER@H_841_419@INSERT@H_841_419@ROW@H_841_419@目标分区
@H_841_419@9@H_841_419@分区表@H_841_419@AFTER@H_841_419@UPDATE@H_841_419@STATEMENT@H_841_419@分区表
表 6 INSERT ON CONFliCT DO nothing(存在冲突)
@H_287_403@顺序@H_72_404@@H_287_403@目标表@H_72_404@@H_287_403@TG_WHEN@H_72_404@@H_287_403@TG_OP@H_72_404@@H_287_403@TG_LEVEL@H_72_404@@H_287_403@TG_table_name@H_72_404@
@H_841_419@1@H_841_419@分区表@H_841_419@BEFORE@H_841_419@INSERT@H_841_419@STATEMENT@H_841_419@分区表
@H_841_419@2@H_841_419@分区@H_841_419@BEFORE@H_841_419@INSERT@H_841_419@ROW@H_841_419@分区
@H_841_419@3@H_841_419@分区表@H_841_419@AFTER@H_841_419@INSERT@H_841_419@STATEMENT@H_841_419@分区表
另外,基于这种 AFTER 行级触发器,分区表还支持延迟的唯一约束。
官方文档:Table Partitioning
人生本来短暂,你又何必匆匆!点个赞再走吧!
总结
以上是内存溢出为你收集整理的PostgreSQL 11 新特性之分区表行级触发器全部内容,希望文章能够帮你解决PostgreSQL 11 新特性之分区表行级触发器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)