View 学习笔记

关于数据库 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)。。。。
 
 ^_^有点乱。。。曾经接触过皮毛,现在想系统的学习下。兴奋之余将其写到部落阁里,还请各位见谅。。(大虾们不要笑话偶啊)
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值