创建视图

最佳实践:使用视图可以使用一些工作得以简化,这些工作包括:复杂的连接或者聚合查询、
逆规范化数据或者为列改名以支持即席查询或者报表。当以这种方法来使用视图时,
视图可以保证数据库的一致性。但不要使用视图来支持主要的用户应用程序,也不要用
它来维护系统的安全性。

1。使用DDL代码创建视图

create view V_YY02        ------创建一个名叫V_YY02的视图
as
SELECT TOP 100 PERCENT dbo.d_Retail.depotid, dbo.d_Retailsub.styleid,   ----下面是视图的SQL代码
      dbo.d_Retailsub.colorid, dbo.d_Retailsub.sizeid, SUM(dbo.d_Retailsub.nums)
      AS ‘合计’
FROM dbo.d_Retail INNER JOIN
      dbo.d_Retailsub ON dbo.d_Retail.retailid = dbo.d_Retailsub.retailid
WHERE (LEN(dbo.d_Retail.depotid) = 3)
GROUP BY dbo.d_Retail.depotid, dbo.d_Retailsub.styleid, dbo.d_Retailsub.colorid,
      dbo.d_Retailsub.sizeid, dbo.d_Retailsub.nums
ORDER BY dbo.d_Retail.depotid       ----也可以使用order by 子句

alter view V_YY02  --修改视图
as
select 语句……

2。对于视图的限制
视图不能包含 select into 选项;
视图不能引用临时表(名字中包含#的表)或者表变量,因为这些类型的表生命周期过于短暂了;
视图不能包含compute 或者compute by 列,它只能使用标准的聚合函数和分组功能;

3。注意事项
将复杂的聚合查询存储为视图;
使用别名将那些含义不清的列名改为可以理解的列名;
只把用户感兴趣的列含在视图中。
通用的、动态的视图会具有较长的生命周期,也更为实用。应当支持用户可以使用where 子句,如果用户不指定where 子句,视图就应当返回全部的行;
在代码中写上静态的日期值是一种不好的开发方法,应支持用户指定值;

4。With Check Option 子句
  限定用户只能存取自己的数据

5。视图代码中可以使用ordery by 、top 等子句

6。保护视图
 最后有两个选项可以保护视图不受到数据模式变化的影响,并防止好事者存取它们的定义。只需在 create 命令中简单地
      加入这两个选项,就可以将它们应用于所创建的视图。
with schemabinding 将视图绑定到基础基表的架构
with encryption 对视图代码加密
第一步:先创建一个表 test
create table test
(
   nameid nvarchar(50)
)

第二步:我们创建一个视图绑定到基础基表的架构
create view Vd_test   --创建一个名叫Vd_test的视图
with schemabinding   ---绑定
as
SELECT nameid FROM dbo.test  ---在绑定时,引用对象时必须指定它们的所用者(这里为 dbo),并且不允许使用 select * 来选取全部的例

第三步:我们来修改一下表结构
alter table test
alter column nameid nvarchar(100)

------------------------------------------------------------------
服务器: 消息 5074,级别 16,状态 3,行 1  ---此时修改表结构时服务器将会报错
对象 'Vd_test' 依赖于 列 'nameid'。
服务器: 消息 4922,级别 16,状态 1,行 1
ALTER TABLE ALTER COLUMN nameid 失败,因为有一个或多个对象访问此列。


使用 with encryption 对视图代码加密,它会加密存放在sysComments表中的视图代码
第一步
使用下面的语句,我们可在在系统表中查到上面视图的原代码:
select text from syscomments join sysobjects  --原代码就存放在 text 列中
on sysobjects.id=syscomments.id
where name='Vd_test'     --指定视图名
返回:
  text
---------------------------------------------------------
create view Vd_test
 with schemabinding       --返回原代码
as   SELECT nameid FROM dbo.test 

第二步
下面使用 with encryption 选项重建 Vd_test视图:
alter view Vd_test
with encryption
as
select nameid from dbo.test

第三步
我们重新运行上面的查询语句:
select text from syscomments join sysobjects  --原代码就存放在 text 列中
on sysobjects.id=syscomments.id
where name='Vd_test'     --指定视图名

   text
-----------------------------------------------------------------------------------------------------
ࠌ븂吮㐚珎᜙ᣚэ閱߹ԫᤅ勥﬑剄誄堼‸嶷朘簐◐屵᪦ꆮ햵䳨즓……  --返回乱码

在企业管理器中查看属性也是看不到原代码的了:
  

必须谨慎的使用这个选项,一旦加密了视图的代码,查询分析器的对象浏览器就
不能够为更改视图生成脚本了。

7。可更新视图
造成人们对视图不满的一个主要原因是它们通常是不可更新的。事实上,除了用简单的
select 语句创建的视图以处,其他的视图都不能用来更新数据。
下面列出一些不可更新数据的因素:
只能对一个表更新,如果视图包含了连接操作,那引用视图的update语句必须只对其中的一个表进行修改;
视图更新问题可以在网络上去查找........

8。视图的性能问题
到目前为止,视图所存在的最大问题就是性能问题。对一个项目来说,与视图相关的开销是否是可以接受。
取决于视图带来的负载和调用视图的频度。如果用户常使用查看和更改数据,建议使用存储过程来取代视图。

9。嵌套视图
因为视图是存储的 SQL select 语句,而在 SQL select 语句中又可像引用表一样来引用视图,
这就使一个视图引用其他的视图成为可能。

前面我们已建立了一个视图 V_YY02 ,下面来创建一个新的视图来引用它:
create view V_YY03      --创建一个名叫V_YY03的视图
as
select dbo.V_YY02.styleid,colorid,sizeid from dbo.V_YY02  --引用 V_YY02 视图
join j_style
on V_YY02.styleid=j_style.styleid    --连接条件
where j_style.styleid like 'B8%'     --条件

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值