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相关推荐

  1. 外网访问postgresql设置

    安装PostgreSQL数据库之后,默认只能本地访问连接.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置. 1.修改postgresql.conf文件 在安装目录下dat ...

  2. EasyMesh_Specification_v4中英文

    1 Overview 2 References [1] IEEE Computer Society, "IEEE Standard for Information Technology – ...

  3. PostgreSQL 不在使用tigger或rule来模拟 SSQLSERVER timestamp 行变化版本管理

    每种数据库都有自己的特色,SQL SERVER 也有自己的招数,timestamp字段类型会针对于行中任何列值的变化,而改变,之前也写过PG 怎么来模拟这个功能 https://blog.csdn.n ...

  4. 插入,在PostgreSQL中重复更新吗?

    本文翻译自:Insert, on duplicate update in PostgreSQL? Several months ago I learned from an answer on Stac ...

  5. PostgreSQL学习手册(五) 函数和操作符

    PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符:     常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符:     下面是Po ...

  6. python 操作 postgresql 数据库

    目录 一 简介 历史 描述 特征 函数 索引 触发器 多版本并发控制 规则 数据类型 用户定义对象 二 数据库连接 2.1 安装 psycopg2 2.2 连接数据库 三 创建表 四 插入操作 4.1 ...

  7. PostgreSQL 无会话、有会话模式 - 客服平均响应速度(RT)实时计算实践(窗口查询\流计算)...

    标签 PostgreSQL , 无会话 , 客服响应速度 , 触发器 , rule , 窗口查询 背景 通常客服系统可能存在一对多,多对多的情况. 例如, 我们在使用淘宝时,与店家交流时,你根本不知道 ...

  8. PostgreSQL源码分析

    PostgreSQL源码结构 PostgreSQL的使用形态 PostgreSQL采用C/S(客户机/服务器)模式结构.应用层通过INET或者Unix Socket利用既定的协议与数据库服务器进行通信 ...

  9. PostgreSQL SQL 语言:数据定义

    本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1.表基础 关系型数据库中的一个表非常像纸上的一张表:它由行和列组成.列的数量和顺序是固定的,并且每一列拥有一个名字.行的 ...

  10. PostgreSQL GIN multi-key search 优化

    标签 PostgreSQL , gin , in , or , multi key , right link scan , skip scan 背景 PostgreSQL中,有一种GIN索引,被广泛应 ...

最新文章

  1. NLP自然语言常见问题及相关模型训练数据格式示例
  2. 任何比较的排序algorithm都需要nlogn
  3. Linux如何将文件中内容放到粘贴板上
  4. “被枪指头,中国教授用功夫击退美国劫匪”,他的身份不简单
  5. matlab中将小数四舍五入,matlab 四舍五入 保留至指定小数(图)
  6. 4KB/2MB/1GB 4级/5级分页模式下的线性地址翻译以及CR3
  7. Exponent CMS 2.3.9 配置文件写入 Getshell分析
  8. oceanbase ODC和Obclient连接mysql类型的ob库
  9. win10键盘失效问题
  10. PytorchVideo Transforms 详解
  11. 这么用 if-else,小鹿差点被辞退!
  12. 解决使用css元素放大动画导致的文字抖动模糊问题
  13. TP6手册理解之架构·服务
  14. linux网络编程tcp和udp基本函数调用过程及如何选择
  15. matlab 固态硬盘,电脑内存和固态硬盘有什么区别 电脑内存和固态硬盘对比【详解】...
  16. AtCoder - ABC 167 - E(数学推理+组合数)
  17. openjudge 1.5.7 奥运奖牌计数
  18. android第三方图标库,Android 第三方库AgentWeb的使用
  19. 如何做一个基于微信在线教育学习小程序系统毕业设计毕设作品
  20. 实战微博互动预测之一_问题分析 以及 分布式下的事件驱动机制(Pub与Sub模式)

热门文章

  1. 带你开发一款给Apk中自动注入代码工具icodetools(完善篇)
  2. Error 4 opening dom ASM/Self in 0x8283c00
  3. 比Gmail更强悍:超大3GB免费邮箱申请!
  4. centos格式化优盘命令_Centos7 格式化分区并挂载
  5. Unity Shader 之 环境光
  6. 调用微信支付api实现用户扫描二维码支付订单
  7. Dracena:实时数字孪生平台
  8. 【C#】EAN-13条形码生成与识别
  9. 胃不好吃什么养胃 三九胃泰提示常吃芝麻更护胃
  10. 数据仓库之内容建设(架构、分层、主数据、指标体系、词根、血缘)