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会触发触发器,不会调用规则,规则会生成新的执行计划。
关于规则的权限可以参考视图的权限,视图就是表和规则的结合。