通过视图来访问数据 其优点是非常明显的 如可以起到数据保密 保证数据的逻辑独立性 简化查询 *** 作等等
但是 话说回来 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用户进行授权 让其可以进行相关的 *** 作
lishixinzhi/Article/program/SQLServer/201311/22451
select from sysobjects where objectproperty(id,N'IsView')=1 查询所有的视图
exec sp_helptext ‘view_name’ 查看视图SQL代码
你的表结构是什么啊?
是几张表啊?3张么?学生表s,课程表c,成绩表sc?其中学生表里面有 学号 姓名 等,课程表有课号,课程名等,成绩表有学号 课号 分数?
这样就可以这样写
create view score as
select sc学号,姓名,sc课号,课程名称,分数
from s,sc,c
where sc学号=s学号 and sc课号=c课号
脑袋有点昏,你先看看
就如同一般的SQL语句的调用时一样的。
如果视图的名字为ViewA;
那么SQL语句就是select from ViewA where +条件
在delphi中调用就是
adoquery 的使用就OK了
视图的创建:
CREATE[ORREPLACE][FORCE|NOFORCE]VIEWview_name
[(alias[,alias])]
ASsubquery
[WITHCHECKOPTION[CONSTRAINTconstraint]]
[WITHREADONLY]
其中:ORREPLACE:若所创建的试图已经存在,ORACLE自动重建该视图;
FORCE:不管基表是否存在ORACLE都会自动创建该视图;
NOFORCE:只有基表都存在ORACLE才会创建该视图:
alias:为视图产生的列定义的别名;
subquery:一条完整的SELECT语句,可以在该语句中定义别名;
WITHCHECKOPTION:插入或修改的数据行必须满足视图定义的约束;
WITHREADONLY:该视图上不能进行任何DML *** 作。
谢谢了,我试过了了,非碘-----这位的是正确的。
我用的是sql2005,有点小差别,[xtype]='V' 改成[type]=‘V’。
我刚找到了另一个办法,共享一下。
use DB
SELECT FROM sysviews
如果不是sql2005改成
use DB
SELECT FROM sysviews
应该就可以查看此数据库的所有视图了。
以上就是关于SQL Server视图管理中的四个限制条件全部的内容,包括:SQL Server视图管理中的四个限制条件、五、在SAKILA数据库中,查看该数据库中有多少张视图,并显示其中的视图sales_by_store的SQL语句、是数据库的题目 ,创建视图[成绩信息表视图]的代码; 成绩信息表视图(学号,姓名,课号,课程名称,分数)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)