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)。

    注意在视图上执行插入、更新或删除的用户必须具有该视图上相应的插入、更新或删除特权。此外,视图的所有者必须拥有底层关系上对应的权限,但执行的用户并不需要底层关系上的任何权限。

    示例

    1. openGauss=# CREATE VIEW myView AS
    2. SELECT * FROM pg_tablespace WHERE spcname = 'pg_default';
    3. --查看视图。
    4. openGauss=# SELECT * FROM myView ;
    5. --删除视图myView
    6. openGauss=# DROP VIEW myView;
    7. --创建基表,并插入数据。
    8. openGauss=# CREATE TABLE base_tbl (a int PRIMARY KEY, b text DEFAULT 'Unspecified');
    9. openGauss=# INSERT INTO base_tbl values (1, 'insertTable');
    10. --创建视图
    11. openGauss=# CREATE VIEW ro_view1 AS SELECT a, b FROM base_tbl;
    12. --视图插入、更新和删除数据
    13. openGauss=# UPDATE ro_view1 SET b = 'updateView' WHERE a = 1;
    14. openGauss=# DELETE FROM ro_view1 WHERE a= 2;
    15. --创建check option视图
    16. openGauss=# CREATE VIEW ro_view2 AS SELECT a, b FROM base_tbl WHERE a > 10 WITH CHECK OPTION;
    17. --插入、更新视图不可见数据失败
    18. openGauss=# INSERT INTO ro_view2 values (5, 'insertView');
    19. openGauss=# UPDATE ro_view2 SET a = 5 WHERE a = 15;