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

文章目录

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

BEGINRAISEINFO′INSERTTRIGGERON


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)。

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


 

更多请见:http://www.mark-to-win.com/tutorial/51630.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值