知识大全 SQL Server视图管理中的四个限制条件

Posted 视图

篇首语:枕上从妨一夜睡,灯前读尽十年诗。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 SQL Server视图管理中的四个限制条件相关的知识,希望对你有一定的参考价值。

SQL Server视图管理中的四个限制条件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  通过视图来访问数据 其优点是非常明显的 如可以起到数据保密 保证数据的逻辑独立性 简化查询操作等等

  但是 话说回来 SQL Server数据库中的视图并不是万能的 他跟表这个基本对象还是有重大的区别 在使用视图的时候 需要遵守四大限制

  限制条件一 视图数据的更改

  当用户更新视图中的数据时 其实更改的是其对应的数据表的数据 无论是对视图中的数据进行更改 还是在视图中插入或者删除数据 都是类似的道理 但是 不是所有视图都可以进行更改 如下面的这些视图 在SQL Server数据库中就不能够直接对其内容进行更新 否则 系统会拒绝这种非法的操作

  如在一个视图中 若采用Group By子句 对视图中的内容进行了汇总 则用户就不能够对这张视图进行更新 这主要是因为采用Group By子句对查询结果进行汇总在后 视图中就会丢失这条纪录的物理存储位置 如此 系统就无法找到需要更新的纪录 若用户想要在视图中更改数据 则数据库管理员就不能够在视图中添加这个Group BY分组语句

  如不能够使用Distinct关键字 这个关键字的用途就是去除重复的纪录 如没有添加这个关键字的时候 视图查询出来的纪录有 条 添加了这个关键字后 数据库就会剔除重复的纪录 只显示不重复的 条纪录 此时 若用户要改变其中一个数据 则数据库就不知道其到底需要更改哪条纪录 因为视图中看起来只有一条纪录 而在基础表中可能对有的纪录有几十条 为此 若在视图中采用了Distinct关键字的话 就无法对视图中的内容进行更改

  如果在视图中有AVG MAX等函数 则也不能够对其进行更新 如在一张视图中 其采用了SUN函数来汇总员工的工资时 此时 就不能够对这张表进行更新 这是数据库为了保障数据一致性所添加的限制条件

  可见 试图虽然方便 安全 但是 其仍然不能够代替表的地位 当需要对一些表中的数据进行更新时 我们往往更多的通过对表的操作来完成 因为对视图内容进行直接更改的话 需要遵守一些限制条件 在实际工作中 更多的处理规则是通过前台程序直接更改后台基础表 至于这些表中数据的安全性 则要依靠前台应用程序来保护 确保更改的准确性 合法性

  限制条件二 定义视图的查询语句中不能够使用某些关键字

  我们都知道 视图其实就是一组查询语句组成 或者说 视图是封装查询语句的一个工具 在查询语句中 我们可以通过一些关键字来格式化显示的结果 如我们在平时工作中 经常会需要把某张表中的数据跟另外一张表进行合并 此时 数据库管理员就可以利用Select Into语句来完成 先把数据从某个表中查询出来 然后再添加到某个表中

  当经常需要类似的操作时 我们是否可以把它制作成一张视图 每次有需要的时候 只需要运行这个视图即可 而不用每次都进行重新书写SQL代码 不过可惜的是 结果是否定的 在SQL Server数据库的视图中 是不能够带有Into关键字 如果要实现类似的功能 只有通过函数或者过程来实现

  另外 跟Oracle数据库不同的是 在微软的SQLServer数据库中创建视图的时候 还有一个额外的限制 就是不能够在创建视图的查询语句中 使用order by排序语句 这是一个很特殊的规定 一些Oracle的数据库管理员 在使用SQL Server数据库创建视图的时候 经常会犯类似的错误 他们就搞不明白 为什么Oracle数据库中可行 但是在微软的数据库中则行不通呢?这恐怕只有微软数据库产品的设计者才能够回答的问题 总之我们要记住的就是 在SQLServer数据库中 建立视图时 查询语句中不能够包含Order By语句

  限制条件三 要对某些列取别名 并保证列名的唯一

  在表关联查询的时候 当不同表的列名相同时 只需要加上表的前缀即可 不需要对列另外进行命名 但是 在创建视图时就会出现问题 数据库会提示 duplicate column name 的错误提示 警告用户有重复的列名 有时候 用户利用Select语句连接多个来自不同表的列 若拥有相同的名字 则这个语句仍然可以执行 但是 若把它复制到创建视图的窗口 创建视图时 就会不成功

  查询语句跟创建视图的查询语句还有很多类似的差异 如有时候 我们在查询语句中 可能会比较频繁的采用一些算术表达式;或者在查询语句中使用函数等等 在查询的时候 我们可以不给这个列 取名 数据库在查询的时候 会自动给其命名 但是 在创建视图时 数据库系统就会给你出难题 系统会提醒你为列取别名

  从以上两个例子中 我们可以看出 虽然视图是对SQL语句的封装 但是 两者仍然有差异 创建视图的查询语句必须要遵守一定的限制 如要保证视图的各个列名的唯一;如果自阿视图中某一列是一个算术表达式 函数或者常数的时候 要给其取名字 等等

  限制条件四 权限上的双重限制

  为了保障基础表数据的安全性 在视图创建的时候 其权限控制比较严格

  一方面 若用户需要创建视图 则必须要有数据库视图创建的权限 这是视图建立时必须遵循的一个基本条件 如有些数据库管理员虽然具有表的创建 修改权限;但是 这并不表示这个数据库管理员就有建立视图的权限 恰恰相反 在大型数据库设计中 往往会对数据库管理员进行分工 建立基础表的就只管建立基础表;负责创建视图的就只有创建视图的权限

  其次 在具有创建视图权限的同时 用户还必须具有访问对应表的权限 如某个数据库管理员 已经有了创建视图的权限 此时 若其需要创建一张员工工资信息的视图 还不一定会成功 这还要这个数据库管理员有美誉跟工资信息相关的基础表的访问权限 如建立员工工资信息这张视图一共涉及到五张表 则这个数据库管理员就需要拥有者每张表的查询权限 若没有的话 则建立这张视图就会以失败告终

  第三 就是视图权限的继承问题 如上面的例子中 这个数据库管理员不是基础表的所有者 但是经过所有者的授权 他就可以对这个基础表进行访问 就可以以此为基础建立视图 但是 这个数据库管理员有没有把对这个基础表的访问权限再授权给其他人呢?如他能否授权给A用户访问员工考勤信息表呢?答案是不一定 默认情况下 数据库管理员不能够再对其他用户进行授权 但是 若基础表的所有者 把这个权利给了数据库管理员之后 则他就可以对用户进行重新授权 让数据库管理员可以给A用户进行授权 让其可以进行相关的操作

cha138/Article/program/SQLServer/201311/22451

相关参考

知识大全 SQL Server 2000的视图中必须小心使用*符号[4]

SQLServer2000的视图中必须小心使用*符号[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 SQL Server 2000的视图中必须小心使用*符号[3]

SQLServer2000的视图中必须小心使用*符号[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 SQL Server 2000的视图中必须小心使用*符号[2]

SQLServer2000的视图中必须小心使用*符号[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 SQL Server 2000的视图中必须小心使用*符号[1]

SQLServer2000的视图中必须小心使用*符号[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 SQL Server 2000的视图中必须小心使用*符号[5]

SQLServer2000的视图中必须小心使用*符号[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 用ASP调用SQL Server的视图和存储过程

用ASP调用SQLServer的视图和存储过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   

知识大全 SQL Server 中的事务(含义,属性,管理)

SQLServer中的事务(含义,属性,管理)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  含

知识大全 绕过程序限制和利用系统表注入SQL Server

绕过程序限制和利用系统表注入SQLServer  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第

知识大全 解决限制访问SQL Server的IP地址的办法

解决限制访问SQLServer的IP地址的办法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 orale数据库如何利用sql语句创建视图的一般性使用方法

  SQLCREATEVIEW语句什么是视图?在SQL中视图是基于SQL语句的结果集的可视化的表  视图包含行和列就像一个真实的表视图中的字段就是来自一个或多个数据库教程中的真实的表中的字段我们可以向