DBLOG
» WTF
Toggle navigation
DBLOG
主页
OCM
1、概览
2、数据导入导出
3、GaussDB(DWS)数据库管理
4、数据库调优与开发实践
5、湖仓一体
6、开发应用
7、集群管理
8、巡检和维运维
About Me
归档
标签
6、视图
无
2025-05-22 15:09:00
0
0
0
admin
[TOC] # 视图简介 - **视图**是一个虚拟的表。数据库中仅存放视图的定义,而不存放视图对应的数据。这些数据仍存放在原来的基本表中,因此若基本表中的数据发生变化,从视图中查询出的数据也随之改变。 - 视图与基本表不同,不是物理上实际存在的,而是一个虚表。  --- # 视图管理 - **创建视图**: - `CREATE VIEW`:创建一个未存在的视图。 - `CREATE OR REPLACE VIEW`:如果同名视图已存在,则将替换该视图,否则新建一个视图。 - `CREATE TEMP VIEW`:创建一个临时视图,该视图随着会话退出而消失。 - **更改视图**: - `ALTER VIEW`:修改视图名称、列的默认值、所有者、所属模式等。 - `ALTER VIEW REBUILD`:视图解耦功能下,可使用已保存的原始语句重新创建视图,恢复依赖关系。 - **删除视图**: - `DROP VIEW`:删除已有视图。 --- # 视图使用 ## 视图使用 – 基本用法 - **查询视图**: ```sql CREATE OR REPLACE VIEW MyView AS SELECT * FROM infotest WHERE price < 1000; CREATE VIEW SELECT * FROM MyView; ``` - **查询视图具体信息**: ```sql \d+ MyView ``` **示例输出**: ``` View "public.myview" Column | Type | Modifiers | Storage | Description --------+-----------------------+-----------+----------+------------ id | integer | | plain | name | character varying(30) | | extended | price | double precision | | plain | View definition: SELECT * FROM infotest WHERE infotest.price < 1000::double precision; ``` ## 视图使用 – 可更新视图 - **背景**: 在使用视图时,为确保权限问题,表上封装了一层视图,对表中数据的 `INSERT`、`UPDATE`、`DELETE`、`SELECT` 均是通过对应的视图操作完成。 - **更新机制**: 视图定义本身就相当于一个子查询,将子查询中的实际表提取出来,作为需要更新的表,对该表进行 `MERGE INTO`、`INSERT`、`UPDATE`、`DELETE` 操作。 - **注意事项**: 如果可更新的视图定义包含 `WHERE` 条件,则该条件将限制 `UPDATE` 和 `DELETE` 语句修改基础表上的行。如果 `UPDATE` 语句更改行后不再满足 `WHERE` 条件,更新后通过视图将无法查询到,类似地,如果 `INSERT` 命令插入了不满足 `WHERE` 条件的数据,插入后通过视图将无法查询到。 ## 视图使用 – 可更新视图的使用限制 - 视图定义的 `FROM` 语句中只能包含一个普通表,不能是系统表、外表、DFS 表、Delta 表、TOAST 表、错误表。 - 视图中必须包含可更新的列,这些列是对基础表可更新列的简单引用。 - 视图定义不能包含 `WITH`、`DISTINCT`、`GROUP BY`、`ORDER BY`、`FOR UPDATE`、`FOR SHARE`、`HAVING`、`TABLESAMPLE`、`LIMIT`、`OFFSET` 子句。 - 视图定义不能包含 `UNION`、`INTERSECT`、`EXCEPT` 集合操作。 - 视图定义的选择列表不能包含聚集函数、窗口函数、返回集合的函数。 - 视图上不能有触发时机为 `INSTEAD OF` 的触发器。 - 视图定义不能包含子查询。 - 视图定义不能包含属性为 `VOLATILE` 的函数(函数值可以在一次表扫描内改变的函数)。 - 视图定义不能对表的分布键所在列起别名,或将普通列起别名为分布键列名。 - 视图更新操作中包含 `RETURNING` 子句时,视图定义中的列只能来自于基础表。 - 视图定义含有 `WHERE` 条件时,该条件将限制 `UPDATE` 和 `DELETE` 语句修改基础表上的行。如果 `UPDATE` 语句更改行后不再满足 `WHERE` 条件,更新后通过视图将无法查询到。 - 在视图上执行插入、更新或删除的用户必须在视图和表上具有相应的插入、更新或删除权限。 ## 视图使用 – 视图解耦 - **背景**: 通常,当删除视图依赖的对象时,需要使用 `CASCADE` 选项级联将视图删除。重建视图依赖对象后,再通过 `CREATE VIEW` 重建视图。当有较多视图依赖于被删除对象时,重建视图的工作量较大。 - **解耦机制**: - 在删除对象时,不删除依赖该对象的视图及其定义,仅删除该条依赖信息。这种方式可以在不指定 `CASCADE` 的情况下删除对象(临时表和临时视图除外)。 - 视图依赖对象重建后,视图可根据其引用的列名的存在与否,分为自动重建、通过 `ALTER VIEW REBUILD` 重建或 `DROP VIEW + CREATE VIEW` 的方式重建。 ### 视图解耦的实现 - **GaussDB(DWS)** 在 `GUC` 参数 `view_independent` 设置为 `on` 时,支持视图解耦和视图重建。 - **视图重建**: - **自动重建**:对应于视图中引用的列名在重建后的依赖对象中存在,则视图可在下次查询时自动重建。 - **ALTER VIEW [ONLY] view_name REBUILD**:对应于视图中引用的列名在重建后的依赖对象中存在,可以执行该命令进行重建。 - **DROP VIEW + CREATE VIEW**:当视图依赖的表中的列被删除或重命名时,需要通过这种方式进行重建。 --- # 视图创建原则 - **根据业务逻辑**: - 把经常使用的数据定义为视图,以简化 SQL 编写。 - 逻辑上的独立性,屏蔽了真实表的结构带来的影响。 - **根据安全性**: - 用视图封装只希望用户看到的数据。 - 对于复杂视图,用户不能通过视图修改基础表数据。 **示例**: ```sql CREATE VIEW stu_class (id, name, class) AS SELECT student.s_id, student.name, stu_info.class FROM student, stu_info WHERE student.s_id = stu_info.s_id; -- 使用视图 SELECT * FROM stu_class WHERE class = 'Beijing'; ``` 用户使用视图时将与普通表无异,从而简化 SQL 查询语句。
上一篇:
5、集群弹性伸缩管理
下一篇:
6、集群资源管理
0
赞
1 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网