GP上的create or replace view只能重定义字段及字段类型和原视图相同的视图,如果有增加或删除字段或者字段类型发生改变此命令就无法重建视图,GP上的视图是由一种叫做规则(Rule)的机制实现的,规则用来实现一些与触发器不同的更加自定义的功能。规则系统介于查询编译器和执行优化器之间,根据规则来修改查询。GP的规则信息保存在pg_rewrite表中。
基本语法:
CREATE RULE 规则名 AS
ON {SELECT | INSERT | UPDATE | DELETE}
TO 表名 [WHERE 规则条件]
DO [INSTEAD] {NOTHING | 命令 | (命令, 命令…)}
建立一个视图过程如下:
aligputf8=# create table h_t (a int ,b int) distributed by (a);
aligputf8=# CREATE VIEW h_v AS SELECT * FROM h_t;
aligputf8=# d h_v
View "ireport.h_v"
Column | Type | Modifiers
——–+———+———–
a | integer |
b | integer |
View definition:
SELECT h_t.a, h_t.b
FROM h_t;
GP上实际将create view这个语句翻译为规则:
aligputf8=# CREATE TABLE h_v (a int ,b int) ;
字段顺序、字段个数及字段类型必须和h_t表一致
aligputf8=# d h_v
Table "ireport.h_v"
Column | Type | Modifiers
——–+———+———–
a | integer |
b | integer |
Distributed by: (a)
aligputf8=# CREATE RULE "_RETURN" AS ON SELECT TO h_v DO INSTEAD SELECT * FROM h_t;
CREATE RULE
aligputf8=# d h_v
View "ireport.h_v"
Column | Type | Modifiers
——–+———+———–
a | integer |
b | integer |
View definition:
SELECT h_t.a, h_t.b
FROM h_t;
这样在查询h_v视图时,把它转换为对隐含的表h_t的查询。
GP上的视图是不能做DML操作的,要对视图的数据进行更新,只能通过定义规则实现,如:
aligputf8=# select * from h_v;
a | b
—+—
1 | 2
aligputf8=# create rule update_h_v as on update to h_v do instead update h_t set b = new.b where a=old.a;
CREATE RULE
aligputf8=# update h_v set b=5 ;
UPDATE 1
aligputf8=# select * from h_v;
a | b
—+—
1 | 5
同样可以对视图定义insert、delete操作的规则
删除规则:
aligputf8=# drop rule update_h_v on h_v ;
DROP RULE