视图实际上就是一个存储查询,重点是是可以混合和匹配来自基本表(或者其他视图)的数据,从而创建在很多方面像另一个基表那样起作用的对象。可以创建一个简单的查询,仅仅从一个表中选择几列,而忽略其他列;或者也可以创建一个复杂的查询,连接几个表,使的这些表看起来像一个表。

一、简单的视图

  视图的语法如下:

CREATE VIEW <view name>
AS
<SELECT statement>

  具体语法:

CREATE VIEW [schema_name].<view name> [(<column name list>)]
[WITH [ENCRYPTION][,SCHEMABINDING][,VIEW_METADATA]]
<SELECT statement>
WITH CHECK OPTION

  示例:

CREATE VIEW columnNamePath_vw
AS
SELECT col_name,col_path
From Nx_column

  这种形式的视图可以达到的目的是,向特定的用户屏蔽一部分列信息,只显示他需要的列,对于敏感的列屏蔽。

  还有一种就是作为过滤的视图,通过使用where子句,达到屏蔽一部分行的信息,只显示他需要的行,对于敏感的行屏蔽。

二、复杂点的视图

  复杂点的视图,其实也复杂不到哪里去,无非是添加一些inner join,left join之类的东西而已。

  此外,还可以通过使用各种函数实现,只返回某一天的数据,或格式经过整理的数据等等。

  视图与的工作方式与表很像,但是还是有一些不同之处。在对视图执行INSERT,UPDATE以及DELETE语句时,要记住以下一些内容

  •   如果视图包含连接,在大多数情况下,除非使用INSTEAD OF触发器,否则不能对数据执行INSERT或DELETE操作。有时(只要只更新来自单个表的列),UPDATE可以  不使用INSTEAD OF触发器来工作,但是这需要一些规划,否则很快会遇到问题。
  •   如果视图仅仅引用单个表,那么在表中的所有必需字段都在视图中或者有默认值的情况下,可以通过使用视图而不用INSTEAD OF触发器来对数据执行INSERT操作。几时对于单个表的视图来说,如果有一列没有出现在不具有默认值的视图中,那么如果想要允许INSERT操作,必须使用INSTEAD OF触发器。
  •   可在有限范围内限制是否可以在视图中插入或更新内容。

  1、用连接的数据处理视图变化

  如果视图有多个表,那么在很多情况下使用视图来修改数据是不允许的-除非使用INSEEAD OF触发器。

  2、必需字段必须在视图中出现或者具有默认值

  在默认情况下,如果使用视图来插入数据(内部查询必定有一个单个表的SELECT操作或者至少必须限制插入只影响到一个表,并且使所有必需的列出现),那么必须能为所有的必需字段(不允许为空的字段)提供一些值。不过要认识到任何没有数据以及不接受NULL数值的列需要出现在视图中。以通过视图来执行INSERT操作。

  3、通过WITH CHECK OPTION限制插入到视图中的内容

  WITH CHECK OPTION是SQL Server中鲜为人知的功能之一。规则很简单-为了通过使用视图更新或者插入数据,结果行必须符合要求以显示在视图结果中。

  示例:

CREATE VIEW PortlandAreaAddress_vw
AS
SELECT AddressId,AddressLine1,City,StateProviceID,PostalCode,ModifiedDate
FROM Person.Address
WHERE PostalCode LIKE '970%' OR PostalCode LIKE '971%' OR PostalCode LIKE '972%' OR PostalCode LIKE '986[6-9]%'
WITH CHECK OPTION

  如果尝试通过对以上视图来更新一行,将PostalCode设置为不是以97或98开头:

  UPDATE PortlandAreaAddress_vw
  SET PostalCode = ''  --不以97 98 开头
  WHERE AddressID = 22

  SQL Server会报错

  视图进行的插入或更新已失败,原因是目标视图或目标视图所跨越的某一视图指定了WITH CHECK OPTION,而该操作的一个或多个结果行又不符合CHECK OPTION约束。

  语句已经终止。

  WHERE子句过滤视图的内容,以便只显示970、971、972或9866~9869之间的邮编,并且WITH CHECK OPTION说明任何INSERT或者UPDATE语句必须满足WHERE之间的条件(而33333这个邮编不满足这个条件)。

  以上语句如果用表执行是正常的。

三、使用T-SQL编辑视图

  在使用T-SQL编辑视图时要记住,这是在完全替换现有的视图。使用ALTER VIEW语句和CREATE VIEW语句的区别主要有以下几点:

  •   ALTER VIEW期望找到一个已有的视图,而CREATE则不是。
  •   ALTER VIEW保留了视图上已经建立的任何权限。
  •   ALTER VIEW保留了任何依赖信息。

  要切记第二点,如果删除了视图,然后在CREATE,那么其效果与ALTER VIEW语句基本一样,只是权限信息要全部重建。

  删除视图的语法如下:

DROP VIEW <view name>,[<view name>,[...n]]

四、审查:显示现有代码

  有两种得到实际视图定义的方法:

  •   sp_helptext
  •   sys.modules元数据函数

  sp_helptext示例:

EXEC sp_helptext PortlandAreaAddress_vw

  SQL Server返回创建视图的代码

  sys.modules示例:

  使用该函数的主要问题在于所有对象都用对象ID编码,对象ID是SQL Server跟踪事物的内部方法,他们是整型值而不是用于对象的名称。可以通过使用OBJECT_ID()函数来避开这个问题。

  SELECT *
  FROM sys.sql_modules
  WHERE  object_id = OBJECT_ID('dbo.PortlandAreaAddress_vw')

  再次得到SQL Server创建视图的代码,和sp_helptext一样。

五、保护代码:加密视图

  加密视图所有必须做的是使用WITH ENCRYPTION选项。技巧:

  •   WITH ENCRYPTION跟在视图名称之后,但在AS关键字之前。
  •   WITH ENCRYPTION不使用OPTION关键字

  如果使用ALTER VIEW语句,那么意味着除了访问权限外,完全替换了现有的视图。那么意味着加密方法也被替换了。如果想对被改变的视图加密,那么必须在ALTER VIEW语句中使用WITH ENCRYPTION子句。  

  示例:

  ALTER VIEW CustomerOrders_vw
  WITH ENCRYPTION
  AS
  SELECT.....

  现在再对以上视图查看信息:

  EXEC sp_helptext CustomerOrders_vw

  SQL Server提示如下:

  对象'CustomerOrders_vw'的文本已加密。

  注意:在使用WITH ENCRYPTION之前,必须先备份好源代码,一旦源代码被加密,就没有办法恢复。如果没有在其他地方存储代码,又需要改变代码只有重新编写。

六、模式绑定

  模式绑定实际上就是将视图所依赖的事物(表或者其他视图)“绑定”到视图。起重要意义在于除非首先删除模式绑定的视图,否则没有人可以修改那些对象(CREATE、ALTER)。

  其作用如下:

  •   可以防止修改底层对象时使用视图"孤立"。如删除了表,但没考虑到视图。
  •   为了允许创建索引视图:如果想要在视图上创建索引,那么必须使用SCHEMABINDING选项来创建视图。
  •   如果要创建一个模式绑定的用户自定义函数来引用视图,那么视图也必须是绑定的。

  视图注意事项总结:

  •   避免基于视图构建视图-而应该将来自第一个视图的合适的查询信息应用到新的视图中。
  •   记住使用WITH CHECK OPTION的视图提供了一些普通CHECK约束所不具备的灵活性
  •   如果不希望其他人能看见你的源代码,就加密视图,但要记得备份未加密的代码;因为加密后就不能恢复为加密的代码了。
  •   除了权限之外,使用ALTER VIEW意味着完全替换了现有的视图。这意味着如果要使被修改的视图里的加密和限制仍然是有效的,那么必须在ALTER语句里包含WITH ENCRYPTION和WITH CHECK OPTION子句。
  •   使用sel_helptext显示视图支持的代码-避免使用系统表。
  •   最小化用于生产查询的视图的用户-因为他们增加了额外的系统开销并且危害性能。

  视图一般用于以下情况:

  •   过滤行
  •   保护敏感数据
  •   降低数据库复杂性
  •   将多个物理数据库抽象为一个逻辑数据库
 
 

SQL Server 视图的更多相关文章

  1. 11、SQL Server 视图、数据库快照

    SQL Server 视图 什么是视图? 视图是一个虚拟的表,内容源于查询的结果集.只有当视图上建立了索引后,才会具体化. 视图可以筛选和处理数据,而不是直接访问基础表.如:创建一个视图,只展示源表中 ...

  2. 使用SQL Server视图的优缺点

    SQL Server视图我们经常会用的到,下面就为您介绍使用SQL Server视图的优缺点,希望可以对您SQL Server视图有更多的了解. 在程序设计的时候必须先了解视图的优缺点,这样可以扬长避 ...

  3. (4.22)sql server视图/索引视图概念

    (4.22)sql server视图 关键词:sql server视图.索引视图 SQL Server视图是由SQL语句组成的逻辑数据库对象.它也可以称为由SQL语句组成的虚拟表,该SQL语句可能包含 ...

  4. CodeSmith生成SQL Server视图的实体类脚本/对应的生成模板

    C#生成sql视图的实体类 using System;using System.Text;using CodeSmith.Engine;using SchemaExplorer;using Syste ...

  5. SQL SERVER视图对查询效率的提高

    SQL SERVER视图不仅可以实现许多我们需要的功能,而且对于SQL SERVER查询效率的提高也有帮助,下面一起来了解一下. 有两张数据表:A和B,其中A的记录为2万条左右,而B中的数据为200万 ...

  6. 通过 SQL Server 视图访问另一个数据库服务器表的方法

    今天项目经理跑过来对我大吼大叫说什么之前安排让我做一大堆接口为什么没做,我直接火了,之前明明没有这个事情…… 不过事情还要解决,好在两个项目都是用的sqlserver,可以通过跨数据库视图来快速解决问 ...

  7. 数往知来SQL SERVER 视图 触发器 <九>

    SQL server学习_视图 1.视图 视图其实是一张虚拟表,他是一张表的部分数据或多张表的综合数据(视图就是把SQL语句封装起来) 可以看做是一个结果集,但是不是一个结果集 视图不具备存储数据的能 ...

  8. SQL Server视图

    想来想去,总想写写SQL Server方面的知识,像视图.存储过程,大数据量操作的优化等等. 先把基础的知识总结个遍先,然后再寻求更高更远的发展.这篇文章,将带大家来看看视图. 何谓视图,视图包含行和 ...

  9. SQL Server 视图索引

    在视图上创建索引的另一个好处是:查询优化器开始在查询中使用视图索引,而不是直接在 FROM 子句中命令视图.这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益.在视图上创建 ...

随机推荐

  1. Linux下编译第三方库的问题

    因为各个Linux发行版之间的差异还是挺大的,有一些预安装在系统上的基本库是不一样的(不仅仅是版本,有一些是有和无的区别). 那么问题来了: 编译第三方库./configure的时候一般我们不会定制那 ...

  2. union all合并记录

    SQL> SELECT empno AS 编码, ename AS 名称, nvl(mgr, deptno) AS 上级编码 FROM emp 2 order by empno 3 UNION ...

  3. STL中istream_iterator和ostream_iterator的基本用法

    标准程序库定义有供输入及输出用的iostream iterator类,称为istream_iterator和ostream_iterator,分别支持单一型别的元素读取和写入.使用这两个iterato ...

  4. 新建一个MVCProject 项目

    App_Data文件夹用于存放数据库文件的 App_Start文件夹用于存放Web应用程序启动时需要进行重要配置的类文件 Content 文件夹用于存放主题样式文件 Controllers 文件夹用于 ...

  5. qt简单界面更新代码(菜鸟级)(部分代码)

    qt简单界面更新代码(菜鸟级)(部分代码)self.timers_1=QtCore.QTimer(self)self.timers_1.timeout.connect(self.min_1)self. ...

  6. Spring Tool Suit 在Eclipse上的安装

    登录http://spring.io/tools/sts/all 下载所需的Spring Tool Suit安装包 我用的是springsource-tool-suite-3.6.1.RELEASE- ...

  7. Jenkins动态部署方案

    在之前一个项目开发中使用到了jenkins自动化测试,根据实际应用,简单整理了其部署方案. 1.部署 2.项目构建 3.重部署 1 部署 登录Jenkins应用管理界面 1)选中一个服务器上已在jen ...

  8. java二维码开发

    之前就写过很多关于二维码的东西,一直没有时间整理一下,所以呢今天就先来介绍一下如何利用java开发二维码.生成二维码有很多jar包可以实现,例如Zxing,QRcode,前者是谷歌的,后者日本的,这里 ...

  9. ajaxFileUpload SyntaxError: syntax error

    在使用ajaxFileUpload上传文件时,Chrome没问题,IE和Firefox出错,Firefox报SyntaxError: syntax error错误 JS代码例如以下: $.ajaxFi ...

  10. C#高性能大容量SOCKET并发(十一):编写上传client

    client封装总体框架 client编程基于堵塞同步模式,仅仅有数据正常发送或接收才返回,假设错误发生则抛出异常,基于TcpClient进行封装,主要类结构例如以下图: TcpClient:NET系 ...