CREATE VIEW
注意事项
被授予CREATE ANY TABLE权限的用户,可以在public模式和用户模式下创建视图。 不可与同一模式下已存在的synonym产生命名冲突。
参数说明
OR REPLACE
当CREATE VIEW中存在OR REPLACE时,表示若以前存在该视图就进行替换,但新查询不能改变原查询的列定义,包括顺序、列名、数据类型、类型精度等,只可在列表末尾添加其他的列。
TEMP | TEMPORARY
创建临时视图。
view_name
要创建的视图名称。可以用模式修饰。
取值范围:字符串,符合标识符命名规范。
column_name
可选的名称列表,用作视图的字段名。如果没有给出,字段名取自查询中的字段名。
view_option_name [= view_option_value]
该子句为视图指定一个可选的参数。
security_barrier
当VIEW试图提供行级安全时,应使用该参数。
取值范围:Boolean类型,TRUE、FALSE。
check_option
指定该视图的检查选项。
取值范围:LOCAL、CASCADED。
query
为视图提供行和列的SELECT或VALUES语句。
简单视图是可自动更新的,系统允许在这类视图上执行INSERT、UPDATE和DELETE语句,如果一个视图满足以下条件,那么它就是可自动更新的。
- 视图的FROM列表中只有一项,并且必须是一个表或者是另一个可自动更新视图。
- 视图定义的顶层不能包含WITH、DISTINCT、GROUP BY、HAVING、LIMIT、OFFSET子句的视图
- 视图定义的顶层不能包含集合操作(UNION、INTERSET、EXCEPT)的视图。
- 视图的目标列表中不能包含聚集函数、窗口函数或者返回集合的函数。
一个可自动更新的视图可以混合可更新列以及不可更新列。如果一个列是对底层关系中一个可更新列的简单引用,则它是可更新的。否则该列是只读的,并且在一个INSERT或者UPDATE语句尝试对它赋值时会报错。
如果视图是可自动更新的,系统将把视图上的任何INSERT、UPDATE或者DELETE语句转换成在底层关系上的对应语句。
如果一个可自动更新的视图包含一个WHERE条件,该条件会限制底层关系的哪些行可以被该视图上的UPDATE以及DELETE语句修改。不过,一个允许被UPDATE修改的行可能让该行不再满足WHERE条件,并且因此也不再能从视图中可见。类似的,一个INSERT命令可能插入不满足WHERE条件的行,因此从该视图中看不到这些行。CHECK OPTION可以用来阻止INSERT和UPDATE命令创建这类从视图中无法看到的行。
一个更加复杂的、不满足上述条件的视图默认是只读的,系统不允许在该视图上执行INSERT、UPDATE和DELETE语句。可以通过在该视图上创建一个INSTEAD OF触发器来获得可更新视图的效果,该触发器必须把该视图上尝试的插入转换成其他表上合法的动作,更多信息请见。另一种方式是创建规则(见CREATE RULE)。
注意在视图上执行插入、更新或删除的用户必须具有该视图上相应的插入、更新或删除特权。此外,视图的所有者必须拥有底层关系上对应的权限,但执行的用户并不需要底层关系上的任何权限。
示例
openGauss=# CREATE VIEW myView AS
SELECT * FROM pg_tablespace WHERE spcname = 'pg_default';
--查看视图。
openGauss=# SELECT * FROM myView ;
--删除视图myView。
openGauss=# DROP VIEW myView;
--创建基表,并插入数据。
openGauss=# CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified');
openGauss=# INSERT INTO base_tbl values (1, 'insertTable');
--创建视图
openGauss=# CREATE VIEW ro_view1 AS SELECT a, b FROM base_tbl;
--视图插入、更新和删除数据
openGauss=# UPDATE ro_view1 SET b = 'updateView' WHERE a = 1;
openGauss=# DELETE FROM ro_view1 WHERE a= 2;
--创建check option视图
openGauss=# CREATE VIEW ro_view2 AS SELECT a, b FROM base_tbl WHERE a > 10 WITH CHECK OPTION;
--插入、更新视图不可见数据失败
openGauss=# INSERT INTO ro_view2 values (5, 'insertView');
openGauss=# UPDATE ro_view2 SET a = 5 WHERE a = 15;