详细说明SQL Server中的视图

您所在的位置:网站首页 联想服务电脑怎么关闭开机密码 详细说明SQL Server中的视图

详细说明SQL Server中的视图

2022-06-02 12:05| 来源: 网络整理| 查看: 265

详细说明SQL Server中的视图 时间:2021-10-29 来源:互联网 编辑:宝哥软件园 浏览:次

1、什么是观点?

2.为什么使用视图;

3、视图中的ORDER BY

4.刷新视图;

5.更新视图;

6.查看选项;

7.索引视图;

1.什么是观点?

视图是由查询定义的虚拟表。与物理表不同,视图中的数据没有物理表示,除非您为其创建索引。如果查询没有索引的视图,Sql Server实际上是访问基础表的。

如果您想要创建一个视图,只需为它指定一个名称并进行查询。Sql Server只保存视图的元数据、用户对对象的描述及其列、安全性、依赖关系等。当查询视图时,无论是获取数据还是更新数据,Sql server都使用视图的定义来访问基础表。

视图在我们的日常操作中也扮演着许多重要的角色。例如,视图可以用来访问过滤和处理的数据,而不是直接访问基本表,并且在某种程度上,基本表受到保护。

当我们创建视图时,我们还应该遵守三个规则:

不能在视图定义中指定ORDER BY,除非该定义包含Top或For Xml描述;的所有列都必须有列名;所有这些列名必须是唯一的;

如果没有top或for xml的描述,视图表中就不能有Order by语句,因为视图被视为一个表,而表是一个逻辑实体,它的行是无序的。视图中的所有列都必须有列名,唯一的情况我想让大家都明白;

以下sql语句表示创建一个简单的视图:

复制代码如下:createviewdbo.v1为select customerid,从客户所在的公司名称(从客户所在的订单中选择customers.customerid=orders.customerid)。

2.为什么使用视图(更新)?

既然SqlServer给我们提供了这样一个对象,那么它就必须有它的功能。但是,我们要么使用过多的视图,要么使用不足的视图,所以有些人建议不要使用视图,而有些人建议使用较少的视图。我们听谁的?

事实上,如果我们掌握了使用视图的目的,我们就可以在正确的地方使用正确的视图。那么视图能为我们解决什么问题呢?

1)为最终用户降低数据库呈现的复杂性。客户端只要给视图写简单的代码,就可以返回我需要的数据,一些复杂的逻辑操作都是在视图中完成的。

2)防止选择敏感列,同时仍然提供对其他重要数据的访问;

3)在视图中增加一些额外的索引,提高查询效率;

事实上,视图不会改变任何东西,而是以某种形式过滤访问的数据。考虑到视图的功能,你应该可以看到视图的概念是如何为没有经验的用户简化数据的(只显示他们关心的数据),或者拒绝用户访问基本表的权限,而是授予他们访问不包含敏感数据的视图的权限,从而提前隐藏敏感数据。

你知道,默认情况下,视图不会做任何特别的事情。视图像查询一样从命令行运行(没有任何形式的预优化),这意味着数据请求和要传递的数据之间有额外的开销。这表明视图永远不会像直接运行底层SELECT语句那样快。但是,该视图的存在有一个原因——即它对用户来说是安全的或简化的,因此您可以平衡您的需求和费用,并找到最适合特定情况的解决方案。

3.视图中的排序依据。

视图代表一个逻辑实体,与表非常相似;

如果我们在上面创建的sql语句中添加一个Order BY语句,看看它有什么效果:

复制代码如下: alter view dbo . v1 as select customerid,company name from customers(从客户所在的订单中选择* . customerid=orders . customerid)order by company name。

运行此语句将失败,并将恢复以下提示:

Msg1033,level15,state1,procedurev1,line5除非还指定了TOP或FOR XML,否则ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效。

根据提示,ORDER BY并非不可用,ORDER By只能在指定Top或for xml语句后使用,例如:

复制代码如下: alter view dbo.v1as从存在的客户中选择top (10) customerid,公司名称(从客户所在的订单中选择customers.customerid=orders.customerid)按公司名称排序。

但是,不建议在视图中使用ORDER BY,因为视图代表一个表,并且表没有排序。因此,建议在查询视图时使用ORDER BY

《SQL Server2005联机丛书》中有一段描述:“在视图、内联函数、派生表或子查询的定义中,使用了ORDER BY语句,子句只能确定TOP子句返回的行。在查询这些构造时,ORDER BY不能保证结果是有序的,除非在查询区域中也指定了ORDER BY。”

4.刷新视图。

如上所述,视图将保存元数据、列、安全性、依赖关系和其他信息。如果我们更改基础表的模式,它将不会直接反映在视图中。更改架构后,使用sp_refreshview存储过程刷新视图的元数据是一个好习惯。

例如,我们创建了表T1和T1的视图V1,然后更改了T1,然后查看了V1的结果:

首先创建表T1:

复制代码如下:如果object _ id ('t1 ')不为空删除表t1创建表t1 (col1int,col2int)插入t1 (col1,col2)值(1,2) go。

然后创建T1的视图V1:

复制代码如下:创建视图v1as从t1选择*。

实际上,我们应该避免在视图的SELECT语句中使用*。这只是一个示范。如果查询查看V1,会出现以下结果://files.jb51.net/file_images/article/201605/201652395552258.png

接下来,我们向表T1添加列col3:

复制代码如下:更改表T1添加列3 INT。

然后再次查询查看V1,你觉得此时的结果是三列还是两列?答案是两栏。T1的模式更改不会影响视图的元数据。此时,如果我们想刷新视图V1,我们可以使用命令:EXEC sp_refreshview V1再次查询,V1的结果是三列。

5.更新视图。

视图是一个虚拟表。当我们查询视图时,我们实际上查询的是基本表。视图不仅可以用作SELECT查询的目标,还可以用作修改语句的目标。当然,当您修改视图时,修改是对基础表的修改,这就像代理一样。当然,如果不允许直接修改基础表,只能修改视图,可以限制想要公开的数据。这样可以在一定程度上保护你的数据,但是这种限制很少。

那么更新视图时有哪些限制呢?

1)、只要视图中有一列不能隐式获取值,就不能将数据插入视图。如果列允许NULL,有默认值或IDETITY属性,则可以隐式获取该值;

2)如果视图包含联接,UPDATE或INSERT语句只能影响联接的一端。也就是说,INSERT或UPDATE语句必须定义一个目标列列表,该列表只能在数据连接的一端使用。不能从由联接查询定义的视图中删除数据;

3)、该列作为计算结果不可修改。比如标量表达式和聚合函数,SqlServer不会试图改变数据库引擎的计算结果;

4)如果在创建或修改视图时指定了WITH CHECK OPTION,则与视图的查询过滤器冲突的INSERT或UPDATE语句将被拒绝;我将在“视图选项”一节中详细解释。

如果在视图上定义了INSERT OF触发器,则可以执行违反这些限制的数据修改语句。在触发器的INSERT中,可以用自己的代码替换原来的修改;

当允许您修改由联接查询定义的视图时,您必须小心,例如一对多关系。如果根据某个索引值“多”,修改“一”端一列值对应的记录,结果可想而知。

6.查看选项。

创建或修改视图时,可以指定一些选项,允许用户控制视图的行为和功能。

在视图头中指定了ENCRYPTION、SCHEMABINDING和VIEW_METADATA选项,而CHECK OPTION选项是在查询之后指定的。

例如:

复制代码如下:使用加密、模式绑定、来自dbo的view _ metadata assessorid创建视图v2。带支票选项的订单。

1)、加密

如果您在构建任何类型的商业软件时需要加密视图,这是一个很好的选择。

如果未指定ENCRYPTION选项,SQLSERVEr会以纯文本形式保存用户定义的语句,如果指定了ENCRYPTION选项,对象的文本将会混乱。

SQLSERVER提供了一个系统函数sp_helptext来查看视图的文本。如果应用了ENCRYPTION选项,将获得语句“对象' xx '的文本已加密”。

注意:在加密之前,请务必备份要加密的视图。一旦加密,你就不能回去了。

2)、SCHEMABINDING

如果使用SCHEMABINDING选项创建视图,SQLSERVER将不允许您删除基础表或修改引用的列,以防止在修改基础对象时视图变得“孤立”。如果有人没有注意到你的视图并执行DROP、删除视图引用的列或其他操作,那就非常糟糕了。如果使用SCHEMABINDING选项,可以避免这种情况。

如果要在视图上创建索引,必须使用SCHMABINDING选项;

如果应用此选项,在定义视图时应注意两点:

1、所有对象必须是两部分名称,例如dbo。应该使用订单而不是订单。

2、不能在SELECT列表中使用*号,所有列名都必须指定一个名称;

3)、检查选项

使用“带检查选项”创建的视图可以防止与视图查询过滤器冲突的INSERT或UPDATE语句。如果没有此选项,视图可以接受不符合查询筛选器的修改。例如:

我们在北风数据库中创建了一个CustomWithOrder视图,但是我们还没有添加WITH CHECK OPTION选项。

复制代码如下:用view _ metadataasselect创建视图customerwithoder选择客户。存在客户的公司名称(从订单中选择1。客户标识=客户。CustomerID)

该视图的功能是查询所有有订单的客户的id和公司名称。接下来,我们在视图中插入一个不存在的用户id和公司名称:

复制代码如下:插入customerwithoder (customerid,公司名称)值(' MySQL ',' my reed ')。

执行成功后,再查询CustomerWithOrder视图,显然不能查询CustomerID为‘MySQL’的用户,因为该视图只包含已经下单的用户;如果您直接查询“客户”表,您会发现这个新的用户信息。

接下来,将带有检查选项的选项添加到客户订单视图中。

复制代码如下:用view _ metadataasselect更改视图customerwithoder选择客户。存在客户的公司名称(从订单中选择1。客户标识=客户。带检查选项的客户标识)

然后执行以下语句:

复制代码如下:插入customerwithoder (customerid,公司名称)值(' ilsql ',' my reed ')。

您将收到以下错误:

尝试插入或更新消息550,级别16,状态1,第2行失败,因为目标视图或目标视图跨越的视图指定了WITH CHECK OPTION,并且操作的一个或多个结果行不符合CHECK OPTION约束。语句已被终止。

4)、视图_元数据

该选项的效果是使视图看起来更像真实的表格。如果没有这个选项,返回给客户端的api的元数据将是视图所依赖的基础表的数据;

如果客户端希望SqlServer发送视图的元数据信息,而不是基础表的元数据,可以在创建或修改视图时指定此选项;是不是很难听,慢慢听我说;

如果用户有权操作视图,但无权操作基础表,则用户可以对视图执行一些操作。如果指定了VIEW_METADATA选项,语句将违反安全性而失败,因为只要指定了VIEW_METADATA,返回给客户端的元数据就是视图的元数据,而不是基础表的元数据。另一方面,如果用户试图通过视图修改数据,并且该操作与视图上定义的CHECK OPTION冲突,则该操作只有直接提交给基础表才能成功。

SqlServer中有这样一个工具。在SqlServer2000中,企业管理器的意思是,如果我们在视图中插入一条记录,例如,在CustomerWithOrder视图中插入一个任意的带有check option的消费者,不管它是否存在,打开并跟踪企业管理器提交给SqlServer的操作,你会发现该操作实际上是以基本表为目标提交的,如果他及时违反了CHECK OPTION,就会成功。然而,在2005年的SSMS,情况就不同了。如果在“修改”视图中手动插入一条记录,它将会成功,这表明尽管指定了VIEW_METADATA和CHECK OPTION选项,但它会插入到基本表中,因此您可以跟踪提交给Sqlserver的操作(使用Sql server Profiler)。但是如果在“打开视图”生成的面板中操作,会失败并提示://files.jb51.net/file_images/article/201605/201652395601172.png

可以再次跟踪提交给Sql server的操作,可以看到他提交的目标对象是一个视图;

同样,如果客户端希望SqlServer发送视图的元数据信息,而不是基础表的元数据,它可以在创建或修改视图时指定此选项。

这次你明白了吗?

个人认为,只要有VIEW_METADATA选项,就需要添加CHECK OPTION,同时还应该添加SCHEMABINDING选项,防止视图被“隔离”,而SCHEMABINDING选项必须添加在索引视图中。

7.索引视图

如果没有索引,视图中的数据将没有任何物理外观。如果添加了索引,视图中的数据将被具体化,并且在修改基础表时,SqlServer将同步索引视图。但是不能直接同步视图内容。

我们知道在表上创建索引可以提高性能,视图也是如此。在视图上创建的第一个索引必须是唯一的聚集索引,然后才能创建其他非聚集索引。

索引视图必须使用SCHEMABINDING选项,并且不能引用其他视图,而只能引用基本表和UDF,它们必须由两部分命名约定引用(参见第5章中的SCHEMABINDING选项)。查看选项)。

除了性能之外,您还可以出于其他原因使用索引视图。例如,在一个基本表中有一列,我们希望强制该列中已知值的唯一性,但允许多个空值。我们做什么呢首先想到的是使用unique约束,但是UNIQUE会认为两个NULL值是相等的,所以这不得不放弃。我们还能做什么?

事实上,我们可以使用索引视图来完成这项任务,并使用索引视图来过滤所有非空数据,因此该索引将防止重复的已知值进入基表,但允许多个空值,因为空值不是UNIQUE索引的一部分。当我们将数据插入基表时,我们使用唯一索引视图来限制我们的数据,从而达到强制一列中已知值唯一的目的。

我们可以演示,我们首先创建一个基本表T2和一个索引视图V2:

复制代码如下:创建表T2 (col1int,col2narchar (50))使用schemabindingasselect创建视图v2从dbo.t2中选择col1,其中col1不为空;在dbo上创建唯一聚集索引idx_col1。V2(第1栏);

然后,我们将以下数据插入T2表:

复制代码如下:插入T2 (col1,col2)值(1,' 2 ')插入T2 (col1,col2)值(1,' 3 ')插入T2 (col1,col2)值(null,' 4 ')插入T2 (col1,col2)。

那么以上4次插入哪一次会失败呢?答案是2。最后,让我们选择基本表T2,看看我们是否满足了我们开始的要求。

复制代码如下:SELECT * FROM t2。

实施情况://files.jb51.net/file_images/article/201605/201652395613188.png

版权声明:详细说明SQL Server中的视图是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

上一篇:详解Yii2分页的使用及其扩展方法 下一篇:JavaScript正则表达式下的相关方法


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3