关于数据库 view视图
1: 也是表,是一张或多张基本表的缩影;
2:是虚拟表;
3:分为Regular View,Updateable View,Indexed View三种;
4:前两种view不会被存储在磁盘上,indexed views可以存储;
5:三种view的共性:
(1)可加密 Encryption:
如果某一视图被加密,则无论创建者还是DBA都不能查看其定义, 因此也就不能对其进行维护。如果需要维护,只能删除该view重新创建,当然也就需要原来视图定义的备份,否则就杯具了。。
当然最好的做法就是在创建所有view的时候都对其定义进行备份,这样就算需要重建也不会很痛苦。
(2)可架构绑定 schemabinding:
如果在创建视图的时候标明schemabinding属性,那么这个视图关联的所有table,view都不能被删除,并且表的schema也不能被修改,除非先把这个视图删掉。这也是一些DBA的法宝,在添加表结构的时候也创建一个带有schemabinding属性的视图,就算从来不使用,这样做以免不小心删掉重要的表。
(3)View_Metadata:
如果创建视图的时候附带这个属性,那么该操作会返回视图的元数据到数据访问库的客户端。
6:限制:
目前在创建View的时候有以下限制:
1) 不能使用Compute / Compute by /Option语句
2) 不能使用INTO关键字
3) 不能引用临时表和表变量
4) 不能使用order by语句,除非有top关键字存在
前三点有待证实。第四点 Oracle DBS 已经支持使用order by 语句 并且没有top关键字存在。
7:View也有insert, update操作。但是通常情况下很难保证能够满足关联表的种种约束,比如主键唯一且不为null。如果视图没有选择基本表的主键作为自己的属性,那么当insert value到视图的时候就会出现主键为null等等异常信息。
现在才想明白,原来对视图的insert和update会作用到关联的表(当然是在用户有对关联表操作的相关权限的时候)。所以一定要慎重啊。。。
8:说到上面讲的往视图中添加数据,我们就有必要谈谈如何给相关用户分配相关权限。。
GRANT { ALL [ PRIVILEGES ] }
| permission [ ( column [ ,...n ] ) ] [ ,...n ]
[ ON [ class :: ] securable ] TO principal [ ,...n ]
[ WITH GRANT OPTION ] [ AS principal ]
有机会进行权限相关的操作。。。练练练。。。。
9:下面这段话是copy过来的,没怎么看懂,需要以后慢慢消化。
*****************************************************
"另外一个就是视图的SQL替代,比如视图中join视图,则在QE(Query Executor)执行之前,QO(Query Optimizer)会把视图中的引用替换为视图定义的表引用,这个是一些理论性的东西。QO就相当于数据库的军师,会在执行之前找最优的Execute Plan(执行计划),实际上QO还有很多值得惊讶的功能。"
*****************************************************
10: Updateable View
上面第7点指出,对某一视图的update和insert会影响到关联的表。
例如:
以T1(pk, value)为例
创建视图V1(pk, value) SQL如下:select pk as vpk, value as vvalue from T1 where pk < 5
此时如果像V1中添加记录(6,8),那么会得到"1 rows inserted"。但是当你查看V1的记录时(select * from V1)并不能找到刚才插入的记录,并不是没有添加成功,数据是被添加到T1上了,而 pk=6 不能满足 pk<5的条件,所以你看不到这条记录。如果selet * from T1你就会发现刚才的数据被添加进去了。。。
11: Indexed view
再次引用
"索引视图顾名思义就是在一个视图上创建一个索引。索引视图与常规视图的不同点在于:常规视图不保存数据,数据是存储在该视图所引用的基表中的,但是索引视图与此不同,索引视图把视图返回回来的结果集保存在硬盘上,以便下次直接使用,这样做的好处是可以大大提高查询速度,特别是一些聚合和计算型的SQL。创建索引视图的原则是索引视图所返回回来的数据相对保持稳定(比如一个月),并且该数据经常被用到(每天都用),如果索引视图返回回来的数据经常变,则维护的成本非常大,所以例如一些函数GetDate()不适用于索引视图,因为GetDate()每次执行的数据都不一样。"
而且创建索引视图还要满足一些列严格的条件,比如:
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
QUOTED_IDENTIFIER, ANSI_NULLS ON
所以一般不建议适用,知道有这么个东西就行了。
语法:
--Set the options to support indexed views.
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO
--Create view with schemabinding.
IF OBJECT_ID ('dbo.vOrders', 'view') IS NOT NULL
DROP VIEW dbo.vOrders ;
GO
CREATE VIEW dbo.vOrders
WITH SCHEMABINDING
AS
SQL statement;
GO
--Create an index on the view.
CREATE UNIQUE CLUSTERED INDEX IDX_V1
ON dbo.vOrders (Column1,Column2);
nn:相关注意事项:
(编码nn为以后修改之便)
(1)无论对表结构还是对视图的查询,最好不要使用*,这是不推荐的,最好的方式就是逐个列出要用到的属性。
(2)对于from之后的table,最好使用schema.tablename的方式。
(3)。。。。
^_^有点乱。。。曾经接触过皮毛,现在想系统的学习下。兴奋之余将其写到部落阁里,还请各位见谅。。(大虾们不要笑话偶啊)