postgresql中的规则

本文探讨了PostgreSQL中的规则系统,它与触发器类似但能改变SQL语义。通过示例展示了如何创建规则,使得查询表2的SQL返回两个表的UNION结果。规则在某些操作如COPY FROM中不会被触发,且会生成新的执行计划。规则的权限管理可参照视图的权限设置,视图可视作表和规则的组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pg中的规则跟触发器的功能很类似,但是规则是能转化原sql语义的。
比如:

myDB=# create table mytab1(id int, note varchar(40));
CREATE TABLE
myDB=# create table mytab2(id int, note varchar(40));
CREATE TABLE
myDB=# create rule "_RETURN" as on select to mytab2 do instead select * from mytab1;
CREATE RULE
myDB=# insert into mytab1 values(1,'aa');
INSERT 0 1
myDB=# insert into mytab2 values(2,'bb');
INSERT 0 1
myDB=# select * from mytab2;
 id | note 
----+------
  1 | aa
  2 | bb
(2 rows)

添加了规则后,原本查询表2的语句返回的结果变成了返回2个表的union

yDB=# create rule rule_mytab_insert as on insert to mytab1 do also insert into mytab_log(oprtype,oprtime,new_id,new_note) values('i',now(),new.id,new.note);
CREATE RULE
myDB=# insert into mytab1 values(33,'cc');
INSERT 0 1
myDB=# select * from mytab1;
 id | note 
----+------
  1 | aa
  2 | bb
 33 | cc
(3 rows)

myDB=# select * from mytab_log;
 seq | oprtype |          oprtime           | old_id | new_id | old_note | new_note 
-----+---------+----------------------------+--------+--------+----------+----------
   1 | i       | 2018-02-09 14:36:01.372807 |        |     33 |          | cc

上面实现了触发器的功能,
copy from会触发触发器,不会调用规则,规则会生成新的执行计划。
关于规则的权限可以参考视图的权限,视图就是表和规则的结合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值