PostgreSQL RULE
RULE语法:
postgres=# \h create rule
Command: CREATE RULE
Description: define a new rewrite rule
Syntax:
CREATE [ OR REPLACE ] RULE name AS ON eventTO table_name [ WHERE condition ]DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }
event: 触发事件,可以是insert,update,delete等
ALSO:比如,被触发的表插入一条数据的数据,触发在另一个表里面也插入一条(日志记录)。
INSTEAD:比如,向被触发的表插入一条数据的时候,用插入到其他表来代替(分区表)。
实例
1. 建表(订单表+订单日志表)
postgres=# create table orders(id serial,name character varying,goods_id integer);
CREATE TABLE
postgres=# \d ordersTable "public.orders"Column | Type | Modifiers
----------+-------------------+-----------------------------------------------------id | integer | not null default nextval('orders_id_seq'::regclass)name | character varying | goods_id | integer
postgres=# create table orders_log(id serial,do_type character varying,old_value character varying,new_value character varying,do_time timestamp without time zone not null default now());
CREATE TABLE
postgres=# \d orders_logTable "public.orders_log"Column | Type | Modifiers
-----------+-----------------------------+---------------------------------------------------------id | integer | not null default nextval('orders_log_id_seq'::regclass)do_type | character varying | old_value | character varying | new_value | character varying | do_time | timestamp without time zone | not null default now()
2. create rule on orders table(rule的作用是将对orders表的操作以日志的方式插入到orders_log表中)
> 记录insert操作的rule:
postgres=# create or replace rule rule_orders_insert_log as on insert to orders do also insert into orders_log(do_type,new_value) values('insert',new.id||','||new.name||','||new.goods_id);
CREATE RULE
> 记录update操作的rule:
postgres=# create or replace rule rule_orders_update_log as on update to orders do also insert into orders_log(do_type,old_value,new_value) values('update',old.id||','||old.name||','||old.goods_id,new.id||','||new.name||','||new.goods_id);
CREATE RULE
> 记录delete操作的rule:
postgres=# create or replace rule rule_orders_delete_log as on delete to orders do also insert into orders_log(do_type,old_value) values('delete',old.id||','||old.name||','||old.goods_id);
CREATE RULE
查看orders表结构:
postgres=# \d ordersTable "public.orders"Column | Type | Modifiers
----------+-------------------+-----------------------------------------------------id | integer | not null default nextval('orders_id_seq'::regclass)name | character varying | goods_id | integer |
Rules:rule_orders_delete_log ASON DELETE TO orders DO INSERT INTO orders_log (do_type, old_value)VALUES ('delete'::character varying, ((((old.id || ','::text) || old.name::text) || ','::text) || old.goods_id))rule_orders_insert_log ASON INSERT TO orders DO INSERT INTO orders_log (do_type, new_value)VALUES ('insert'::character varying, ((((new.id || ','::text) || new.name::text) || ','::text) || new.goods_id))rule_orders_update_log ASON UPDATE TO orders DO INSERT INTO orders_log (do_type, old_value, new_value)VALUES ('update'::character varying, ((((old.id || ','::text) || old.name::text) || ','::text) || old.goods_id), ((((new.id || ','::text) || new.name::text) || ','::text) || new.goods_id))
可以看到,rule不像function,触发器一样独立存在的,而是依附于表上,当你把表删了,相应的rule就一起被删了。
3. 测试:
> insert:
postgres=# insert into orders(name,goods_id) values('aa',101);
INSERT 0 1
postgres=# insert into orders(name,goods_id) values('bb',102);
INSERT 0 1
查看orders表和orders_log中的数据:
postgres=# select * from orders;id | name | goods_id
----+------+----------1 | aa | 1013 | bb | 102
(2 rows)postgres=# select * from orders_log;id | do_type | old_value | new_value | do_time
----+---------+-----------+-----------+----------------------------1 | insert | | 2,aa,101 | 2015-04-06 17:15:20.0884122 | insert | | 4,bb,102 | 2015-04-06 17:15:28.150866
(2 rows)
> update:
postgres=# update orders set name ='cc',goods_id=201 where id=1;
UPDATE 1
查看orders表和orders_log中的数据:
postgres=# select * from orders;id | name | goods_id
----+------+----------3 | bb | 1021 | cc | 201
(2 rows)postgres=# select * from orders_log;id | do_type | old_value | new_value | do_time
----+---------+-----------+-----------+----------------------------1 | insert | | 2,aa,101 | 2015-04-06 17:15:20.0884122 | insert | | 4,bb,102 | 2015-04-06 17:15:28.1508663 | update | 1,aa,101 | 1,cc,201 | 2015-04-06 17:18:07.127828
(3 rows)
> delete:
postgres=# delete from orders where id=1;
DELETE 1
查看orders表和orders_log中的数据:
postgres=# select * from orders;id | name | goods_id
----+------+----------3 | bb | 102
(1 row)postgres=# select * from orders_log;id | do_type | old_value | new_value | do_time
----+---------+-----------+-----------+----------------------------1 | insert | | 2,aa,101 | 2015-04-06 17:15:20.0884122 | insert | | 4,bb,102 | 2015-04-06 17:15:28.1508663 | update | 1,aa,101 | 1,cc,201 | 2015-04-06 17:18:07.1278284 | delete | 1,cc,201 | | 2015-04-06 17:19:20.672241
(4 rows)
完。
PostgreSQL RULE相关推荐
- 外网访问postgresql设置
安装PostgreSQL数据库之后,默认只能本地访问连接.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置. 1.修改postgresql.conf文件 在安装目录下dat ...
- EasyMesh_Specification_v4中英文
1 Overview 2 References [1] IEEE Computer Society, "IEEE Standard for Information Technology – ...
- PostgreSQL 不在使用tigger或rule来模拟 SSQLSERVER timestamp 行变化版本管理
每种数据库都有自己的特色,SQL SERVER 也有自己的招数,timestamp字段类型会针对于行中任何列值的变化,而改变,之前也写过PG 怎么来模拟这个功能 https://blog.csdn.n ...
- 插入,在PostgreSQL中重复更新吗?
本文翻译自:Insert, on duplicate update in PostgreSQL? Several months ago I learned from an answer on Stac ...
- PostgreSQL学习手册(五) 函数和操作符
PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是Po ...
- python 操作 postgresql 数据库
目录 一 简介 历史 描述 特征 函数 索引 触发器 多版本并发控制 规则 数据类型 用户定义对象 二 数据库连接 2.1 安装 psycopg2 2.2 连接数据库 三 创建表 四 插入操作 4.1 ...
- PostgreSQL 无会话、有会话模式 - 客服平均响应速度(RT)实时计算实践(窗口查询\流计算)...
标签 PostgreSQL , 无会话 , 客服响应速度 , 触发器 , rule , 窗口查询 背景 通常客服系统可能存在一对多,多对多的情况. 例如, 我们在使用淘宝时,与店家交流时,你根本不知道 ...
- PostgreSQL源码分析
PostgreSQL源码结构 PostgreSQL的使用形态 PostgreSQL采用C/S(客户机/服务器)模式结构.应用层通过INET或者Unix Socket利用既定的协议与数据库服务器进行通信 ...
- PostgreSQL SQL 语言:数据定义
本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1.表基础 关系型数据库中的一个表非常像纸上的一张表:它由行和列组成.列的数量和顺序是固定的,并且每一列拥有一个名字.行的 ...
- PostgreSQL GIN multi-key search 优化
标签 PostgreSQL , gin , in , or , multi key , right link scan , skip scan 背景 PostgreSQL中,有一种GIN索引,被广泛应 ...
最新文章
- NLP自然语言常见问题及相关模型训练数据格式示例
- 任何比较的排序algorithm都需要nlogn
- Linux如何将文件中内容放到粘贴板上
- “被枪指头,中国教授用功夫击退美国劫匪”,他的身份不简单
- matlab中将小数四舍五入,matlab 四舍五入 保留至指定小数(图)
- 4KB/2MB/1GB 4级/5级分页模式下的线性地址翻译以及CR3
- Exponent CMS 2.3.9 配置文件写入 Getshell分析
- oceanbase ODC和Obclient连接mysql类型的ob库
- win10键盘失效问题
- PytorchVideo Transforms 详解
- 这么用 if-else,小鹿差点被辞退!
- 解决使用css元素放大动画导致的文字抖动模糊问题
- TP6手册理解之架构·服务
- linux网络编程tcp和udp基本函数调用过程及如何选择
- matlab 固态硬盘,电脑内存和固态硬盘有什么区别 电脑内存和固态硬盘对比【详解】...
- AtCoder - ABC 167 - E(数学推理+组合数)
- openjudge 1.5.7 奥运奖牌计数
- android第三方图标库,Android 第三方库AgentWeb的使用
- 如何做一个基于微信在线教育学习小程序系统毕业设计毕设作品
- 实战微博互动预测之一_问题分析 以及 分布式下的事件驱动机制(Pub与Sub模式)