="t18"> 通过视图来访问数据
![](/icons/18375dou.gif)
其优点是非常明显
![](/icons/18375de.gif)
![](/icons/18375dou2.gif)
如可以起到数据保密、保证数据
![](/icons/18375de.gif)
逻辑独立性、简化查询操作等等
![](/icons/18375dou2.gif)
但是
![](/icons/18375dou.gif)
话说回来
![](/icons/18375dou.gif)
SQL Server数据库中
![](/icons/18375de.gif)
视图并不是万能
![](/icons/18375de.gif)
![](/icons/18375dou.gif)
他跟表这个基本对象还是有重大
![](/icons/18375de.gif)
区别
![](/icons/18375dou2.gif)
在使用视图
![](/icons/18375de.gif)
时候
![](/icons/18375dou.gif)
需要遵守 4大限制
![](/icons/18375dou2.gif)
限制条件
![](/icons/18375yi.gif)
:视图数据
![](/icons/18375de.gif)
更改
当用户更新视图中
![](/icons/18375de.gif)
数据时
![](/icons/18375dou.gif)
其实更改
![](/icons/18375de.gif)
是其对应
![](/icons/18375de.gif)
数据表
![](/icons/18375de.gif)
数据
![](/icons/18375dou2.gif)
无论是对视图中
![](/icons/18375de.gif)
数据进行更改
![](/icons/18375dou.gif)
还是在视图中插入或者删除数据
![](/icons/18375dou.gif)
都是类似
![](/icons/18375de.gif)
道理
![](/icons/18375dou2.gif)
但是
![](/icons/18375dou.gif)
不是所有视图都可以进行更改
![](/icons/18375dou2.gif)
如下面
![](/icons/18375de.gif)
这些视图
![](/icons/18375dou.gif)
在SQL Server数据库中就不能够直接对其内容进行更新
![](/icons/18375dou.gif)
否则
![](/icons/18375dou.gif)
系统会拒绝这种非法
![](/icons/18375de.gif)
操作
![](/icons/18375dou2.gif)
如在
![](/icons/18375yi.gif)
个视图中
![](/icons/18375dou.gif)
若采用Group By子句
![](/icons/18375dou.gif)
对视图中
![](/icons/18375de.gif)
内容进行了汇总
![](/icons/18375dou2.gif)
则用户就不能够对这张视图进行更新
![](/icons/18375dou2.gif)
这主要是
![](/icons/18375yinwei.gif)
采用Group By子句对查询结果进行汇总在后
![](/icons/18375dou.gif)
视图中就会丢失这条纪录
![](/icons/18375de.gif)
物理存储位置
![](/icons/18375dou2.gif)
如此
![](/icons/18375dou.gif)
系统就无法找到需要更新
![](/icons/18375de.gif)
纪录
![](/icons/18375dou2.gif)
若用户想要在视图中更改数据
![](/icons/18375dou.gif)
则数据库管理员就不能够在视图中添加这个Group BY分组语句
![](/icons/18375dou2.gif)
如不能够使用Distinct关键字
![](/icons/18375dou2.gif)
这个关键字
![](/icons/18375de.gif)
用途就是去除重复
![](/icons/18375de.gif)
纪录
![](/icons/18375dou2.gif)
如没有添加这个关键字
![](/icons/18375de.gif)
时候
![](/icons/18375dou.gif)
视图查询出来
![](/icons/18375de.gif)
纪录有250条
![](/icons/18375dou2.gif)
添加了这个关键字后
![](/icons/18375dou.gif)
数据库就会剔除重复
![](/icons/18375de.gif)
纪录
![](/icons/18375dou.gif)
只显示不重复
![](/icons/18375de.gif)
50条纪录
![](/icons/18375dou2.gif)
此时
![](/icons/18375dou.gif)
若用户要改变其中
![](/icons/18375yi.gif)
个数据
![](/icons/18375dou.gif)
则数据库就不知道其到底需要更改哪条纪录
![](/icons/18375dou2.gif)
![](/icons/18375yinwei.gif)
视图中看起来只有
![](/icons/18375yi.gif)
条纪录
![](/icons/18375dou.gif)
而在基础表中可能对有
![](/icons/18375de.gif)
纪录有几十条
![](/icons/18375dou2.gif)
为此
![](/icons/18375dou.gif)
若在视图中采用了Distinct关键字
![](/icons/18375de.gif)
话
![](/icons/18375dou.gif)
就无法对视图中
![](/icons/18375de.gif)
内容进行更改
![](/icons/18375dou2.gif)
如果在视图中有AVG、MAX等
![](/icons/18375hanshu.gif)
![](/icons/18375dou.gif)
则也不能够对其进行更新
![](/icons/18375dou2.gif)
如在
![](/icons/18375yi.gif)
张视图中
![](/icons/18375dou.gif)
其采用了SUN
![](/icons/18375hanshu.gif)
来汇总员工
![](/icons/18375de.gif)
工资时
![](/icons/18375dou.gif)
此时
![](/icons/18375dou.gif)
就不能够对这张表进行更新
![](/icons/18375dou2.gif)
这是数据库为了保障数据
![](/icons/18375yi.gif)
致性所添加
![](/icons/18375de.gif)
限制条件
![](/icons/18375dou2.gif)
可见
![](/icons/18375dou.gif)
试图虽然方便、安全
![](/icons/18375dou.gif)
但是
![](/icons/18375dou.gif)
其仍然不能够代替表
![](/icons/18375de.gif)
地位
![](/icons/18375dou2.gif)
当需要对
![](/icons/18375yi.gif)
些表中
![](/icons/18375de.gif)
数据进行更新时
![](/icons/18375dou.gif)
我们往往更多
![](/icons/18375de.gif)
通过对表
![](/icons/18375de.gif)
操作来完成
![](/icons/18375dou2.gif)
![](/icons/18375yinwei.gif)
对视图内容进行直接更改
![](/icons/18375de.gif)
话
![](/icons/18375dou.gif)
需要遵守
![](/icons/18375yi.gif)
些限制条件
![](/icons/18375dou2.gif)
在实际工作中
![](/icons/18375dou.gif)
更多
![](/icons/18375de.gif)
处理规则是通过前台
![](/icons/18375chengxu.gif)
直接更改后台基础表
![](/icons/18375dou2.gif)
至于这些表中数据
![](/icons/18375de.gif)
安全性
![](/icons/18375dou.gif)
则要依靠前台应用
![](/icons/18375chengxu.gif)
来保护
![](/icons/18375dou2.gif)
确保更改
![](/icons/18375de.gif)
准确性、合法性
![](/icons/18375dou2.gif)
限制条件 2:定义视图
![](/icons/18375de.gif)
查询语句中不能够使用某些关键字
我们都知道
![](/icons/18375dou.gif)
视图其实就是
![](/icons/18375yi.gif)
组查询语句组成
![](/icons/18375dou2.gif)
或者说
![](/icons/18375dou.gif)
视图是封装查询语句
![](/icons/18375de.gif)
![](/icons/18375yi.gif)
个工具
![](/icons/18375dou2.gif)
在查询语句中
![](/icons/18375dou.gif)
我们可以通过
![](/icons/18375yi.gif)
些关键字来格式化显示
![](/icons/18375de.gif)
结果
![](/icons/18375dou2.gif)
如我们在平时工作中
![](/icons/18375dou.gif)
经常会需要把某张表中
![](/icons/18375de.gif)
数据跟另外
![](/icons/18375yi.gif)
张表进行合并
![](/icons/18375dou2.gif)
此时
![](/icons/18375dou.gif)
数据库管理员就可以利用Select Into语句来完成
![](/icons/18375dou2.gif)
先把数据从某个表中查询出来
![](/icons/18375dou.gif)
然后再添加到某个表中
![](/icons/18375dou2.gif)
当经常需要类似
![](/icons/18375de.gif)
操作时
![](/icons/18375dou.gif)
我们是否可以把它制作成
![](/icons/18375yi.gif)
张视图
![](/icons/18375dou2.gif)
每次有需要
![](/icons/18375de.gif)
时候
![](/icons/18375dou.gif)
只需要运行这个视图即可
![](/icons/18375dou.gif)
而不用每次都进行重新书写SQL代码
![](/icons/18375dou2.gif)
不过可惜
![](/icons/18375de.gif)
是
![](/icons/18375dou.gif)
结果是否定
![](/icons/18375de.gif)
![](/icons/18375dou2.gif)
在SQL Server数据库
![](/icons/18375de.gif)
视图中
![](/icons/18375dou.gif)
是不能够带有Into关键字
![](/icons/18375dou2.gif)
如果要实现类似
![](/icons/18375de.gif)
功能
![](/icons/18375dou.gif)
只有通过
![](/icons/18375hanshu.gif)
或者过程来实现
![](/icons/18375dou2.gif)
另外
![](/icons/18375dou.gif)
跟Oracle数据库区别
![](/icons/18375de.gif)
是
![](/icons/18375dou.gif)
在微软
![](/icons/18375de.gif)
SQLServer数据库中创建视图
![](/icons/18375de.gif)
时候
![](/icons/18375dou.gif)
还有
![](/icons/18375yi.gif)
个额外
![](/icons/18375de.gif)
限制
![](/icons/18375dou2.gif)
就是不能够在创建视图
![](/icons/18375de.gif)
查询语句中
![](/icons/18375dou.gif)
使用order by排序语句
![](/icons/18375dou2.gif)
这是
![](/icons/18375yi.gif)
个很特殊
![](/icons/18375de.gif)
规定
![](/icons/18375dou2.gif)
![](/icons/18375yi.gif)
些Oracle
![](/icons/18375de.gif)
数据库管理员
![](/icons/18375dou.gif)
在使用SQL Server数据库创建视图
![](/icons/18375de.gif)
时候
![](/icons/18375dou.gif)
经常会犯类似
![](/icons/18375de.gif)
![](/icons/18375cuowu.gif)
![](/icons/18375dou2.gif)
他们就搞不明白
![](/icons/18375dou.gif)
为什么Oracle数据库中可行
![](/icons/18375dou.gif)
但是在微软
![](/icons/18375de.gif)
数据库中则行不通呢?这恐怕只有微软数据库产品
![](/icons/18375de.gif)
设计者才能够回答
![](/icons/18375de.gif)
问题
![](/icons/18375dou2.gif)
总的我们要记住
![](/icons/18375de.gif)
就是
![](/icons/18375dou.gif)
在SQLServer数据库中
![](/icons/18375dou.gif)
建立视图时
![](/icons/18375dou.gif)
查询语句中不能够包含Order By语句
![](/icons/18375dou2.gif)
限制条件 3:要对某些列取别名
![](/icons/18375dou.gif)
并保证列名
![](/icons/18375de.gif)
唯
![](/icons/18375yi.gif)
在表关联查询
![](/icons/18375de.gif)
时候
![](/icons/18375dou.gif)
当区别表
![](/icons/18375de.gif)
列名相同时
![](/icons/18375dou.gif)
只需要加上表
![](/icons/18375de.gif)
前缀即可
![](/icons/18375dou2.gif)
不需要对列另外进行命名
![](/icons/18375dou2.gif)
但是
![](/icons/18375dou.gif)
在创建视图时就会出现问题
![](/icons/18375dou.gif)
数据库会提示 “duplicate column name”
![](/icons/18375de.gif)
![](/icons/18375cuowu.gif)
提示
![](/icons/18375dou.gif)
警告用户有重复
![](/icons/18375de.gif)
列名
![](/icons/18375dou2.gif)
有时候
![](/icons/18375dou.gif)
用户利用Select语句连接多个来自区别表
![](/icons/18375de.gif)
列
![](/icons/18375dou.gif)
若拥有相同
![](/icons/18375de.gif)
名字
![](/icons/18375dou.gif)
则这个语句仍然可以执行
![](/icons/18375dou2.gif)
但是
![](/icons/18375dou.gif)
若把它复制到创建视图
![](/icons/18375de.gif)
窗口
![](/icons/18375dou.gif)
创建视图时
![](/icons/18375dou.gif)
就会不成功
![](/icons/18375dou2.gif)
查询语句跟创建视图
![](/icons/18375de.gif)
查询语句还有很多类似
![](/icons/18375de.gif)
差异
![](/icons/18375dou2.gif)
如有时候
![](/icons/18375dou.gif)
我们在查询语句中
![](/icons/18375dou.gif)
可能会比较频繁
![](/icons/18375de.gif)
采用
![](/icons/18375yi.gif)
些算术表达式;或者在查询语句中使用
![](/icons/18375hanshu.gif)
等等
![](/icons/18375dou2.gif)
在查询
![](/icons/18375de.gif)
时候
![](/icons/18375dou.gif)
我们可以不给这个列“取名”
![](/icons/18375dou2.gif)
数据库在查询
![](/icons/18375de.gif)
时候
![](/icons/18375dou.gif)
会自动给其命名
![](/icons/18375dou2.gif)
但是
![](/icons/18375dou.gif)
在创建视图时
![](/icons/18375dou.gif)
数据库系统就会给你出难题
![](/icons/18375dou2.gif)
系统会提醒你为列取别名
![](/icons/18375dou2.gif)
从以上两个例子中
![](/icons/18375dou.gif)
我们可以看出
![](/icons/18375dou.gif)
虽然视图是对SQL语句
![](/icons/18375de.gif)
封装
![](/icons/18375dou.gif)
但是
![](/icons/18375dou.gif)
两者仍然有差异
![](/icons/18375dou2.gif)
创建视图
![](/icons/18375de.gif)
查询语句必须要遵守
![](/icons/18375yi.gif)
定
![](/icons/18375de.gif)
限制
![](/icons/18375dou2.gif)
如要保证视图
![](/icons/18375de.gif)
各个列名
![](/icons/18375de.gif)
唯
![](/icons/18375yi.gif)
;如果自阿视图中某
![](/icons/18375yi.gif)
列是
![](/icons/18375yi.gif)
个算术表达式、
![](/icons/18375hanshu.gif)
或者常数
![](/icons/18375de.gif)
时候
![](/icons/18375dou.gif)
要给其取名字
![](/icons/18375dou.gif)
等等
![](/icons/18375dou2.gif)
限制条件 4:权限上
![](/icons/18375de.gif)
双重限制
为了保障基础表数据
![](/icons/18375de.gif)
安全性
![](/icons/18375dou.gif)
在视图创建
![](/icons/18375de.gif)
时候
![](/icons/18375dou.gif)
其权限控制比较严格
![](/icons/18375yi.gif)
方面
![](/icons/18375dou.gif)
若用户需要创建视图
![](/icons/18375dou.gif)
则必须要有数据库视图创建
![](/icons/18375de.gif)
权限
![](/icons/18375dou2.gif)
这是视图建立时必须遵循
![](/icons/18375de.gif)
![](/icons/18375yi.gif)
个基本条件
![](/icons/18375dou2.gif)
如有些数据库管理员虽然具有表
![](/icons/18375de.gif)
创建、修改权限;但是
![](/icons/18375dou.gif)
这并不表示这个数据库管理员就有建立视图
![](/icons/18375de.gif)
权限
![](/icons/18375dou2.gif)
恰恰相反
![](/icons/18375dou.gif)
在大型数据库设计中
![](/icons/18375dou.gif)
往往会对数据库管理员进行分工
![](/icons/18375dou2.gif)
建立基础表
![](/icons/18375de.gif)
就只管建立基础表;负责创建视图
![](/icons/18375de.gif)
就只有创建视图
![](/icons/18375de.gif)
权限
![](/icons/18375dou2.gif)
其次
![](/icons/18375dou.gif)
在具有创建视图权限
![](/icons/18375de.gif)
同时
![](/icons/18375dou.gif)
用户还必须具有访问对应表
![](/icons/18375de.gif)
权限
![](/icons/18375dou2.gif)
如某个数据库管理员
![](/icons/18375dou.gif)
已经有了创建视图
![](/icons/18375de.gif)
权限
![](/icons/18375dou2.gif)
此时
![](/icons/18375dou.gif)
若其需要创建
![](/icons/18375yi.gif)
张员工工资信息
![](/icons/18375de.gif)
视图
![](/icons/18375dou.gif)
还不
![](/icons/18375yi.gif)
定会成功
![](/icons/18375dou2.gif)
这还要这个数据库管理员有美誉跟工资信息相关
![](/icons/18375de.gif)
基础表
![](/icons/18375de.gif)
访问权限
![](/icons/18375dou2.gif)
如建立员工工资信息这张视图
![](/icons/18375yi.gif)
共涉及到 5张表
![](/icons/18375dou.gif)
则这个数据库管理员就需要拥有者每张表
![](/icons/18375de.gif)
查询权限
![](/icons/18375dou2.gif)
若没有
![](/icons/18375de.gif)
话
![](/icons/18375dou.gif)
则建立这张视图就会以失败告终
![](/icons/18375dou2.gif)
第 3
![](/icons/18375dou.gif)
就是视图权限
![](/icons/18375de.gif)
继承问题
![](/icons/18375dou2.gif)
如上面
![](/icons/18375de.gif)
例子中
![](/icons/18375dou.gif)
这个数据库管理员不是基础表
![](/icons/18375de.gif)
所有者
![](/icons/18375dou2.gif)
但是经过所有者
![](/icons/18375de.gif)
授权
![](/icons/18375dou.gif)
他就可以对这个基础表进行访问
![](/icons/18375dou.gif)
就可以以此为基础建立视图
![](/icons/18375dou2.gif)
但是
![](/icons/18375dou.gif)
这个数据库管理员有没有把对这个基础表
![](/icons/18375de.gif)
访问权限再授权给其他人呢?如他能否授权给A用户访问员工考勤信息表呢?答案是不
![](/icons/18375yi.gif)
定
![](/icons/18375dou2.gif)
默认情况下
![](/icons/18375dou.gif)
数据库管理员不能够再对其他用户进行授权
![](/icons/18375dou2.gif)
但是
![](/icons/18375dou.gif)
若基础表
![](/icons/18375de.gif)
所有者
![](/icons/18375dou.gif)
把这个权利给了数据库管理员的后
![](/icons/18375dou.gif)
则他就可以对用户进行重新授权
![](/icons/18375dou2.gif)
让数据库管理员可以给A用户进行授权
![](/icons/18375dou.gif)
让其可以进行相关
![](/icons/18375de.gif)
操作
![](/icons/18375dou2.gif)
可见
![](/icons/18375dou.gif)
视图虽然灵活
![](/icons/18375dou.gif)
安全
![](/icons/18375dou.gif)
方便
![](/icons/18375dou.gif)
但是其仍然有比较多
![](/icons/18375de.gif)
限制条件
![](/icons/18375dou2.gif)
根据笔者
![](/icons/18375de.gif)
经验
![](/icons/18375dou.gif)
![](/icons/18375yi.gif)
般在报表、表单等等工作上
![](/icons/18375dou.gif)
采用视图会更加
![](/icons/18375de.gif)
合理
![](/icons/18375dou2.gif)
![](/icons/18375yinwei.gif)
其 SQL语句可以重复使用
![](/icons/18375dou2.gif)
而在基础表更新上
![](/icons/18375dou.gif)
包括纪录
![](/icons/18375de.gif)
更改、删除或者插入上
![](/icons/18375dou.gif)
往往是直接对基础表进行更新
![](/icons/18375dou2.gif)
对于
![](/icons/18375yi.gif)
些表
![](/icons/18375de.gif)
约束
![](/icons/18375dou.gif)
可以通过触发器、规则等等来实现;甚至可以通过前台SQL语句直接实现约束
![](/icons/18375dou2.gif)
作为数据库管理员
![](/icons/18375dou.gif)
要有这个能力
![](/icons/18375dou.gif)
能够判断在什么时候使用视图
![](/icons/18375dou.gif)
什么时候直接
![](/icons/18375diaoyong.gif)
基础表
延伸阅读
最新评论