标签归档:视图

mssql sqlserver 数据库视图作用说明?视图的应用场景说明?


摘要:
下文详细讲述数据库视图的作用及应用场景,如下所示:
实验环境:sql server 2008 R2


很多人可能有和我一样的困惑,视图明明就是一个查询的sql脚本,而且大部分视图不占用任何存储空间,我们为什么要使用视图呢?是不是多此一举呢?
通过一段时间的使用和学习,我将个人总结关于视图的一些想法分享给大家,如下所示

一、简化数据操作方法

因为 视图可以将多个表进行关联组合,形成新的数据集合,那么当我们检索数据时,我们可以通过直接查阅视图的方法对数据进行读取,可以简化代码的编写时间。
例:
我们进行以下的三张表,进行组合并形成一个视图,下次我们涉及同时关联查询三张表时,直接读取视图就可。

二、安全性

2.1因为视图时虚拟,并且可对物理数据表进行了别名化,
当我们检索数据时,只需检索视图,并且不需知道实际的物理表的名称,这种操作方式加强了数据库的安全。
2.2 有些视图可以设置为只读视图,此时视图所涉及的数据也得到了安全的保证。

三、数据安全性

我们可以针对不同的角色编写不同的视图,并加入不同的查询条件,使不同的角色人员只可查阅相应视图,使用这种方式可以达到加强数据范围的权限。
例:
为行政人员
新建一个视图,让其只可查询采购物品类别为“行政类”的产品。
为销售人员
新建一个视图,让其只可查询采购物品类别为“经营类”的产品。
为售后人员
新建一个视图,让其只可查询采购物品类别为“售后类”的产品。

delete 删除视图,是否可以达到同时删除多表的效果呢


摘要:
下文通过举例讲述delete对视图的删除效果,如下所示:
实验环境:sql server 2008 R2


   /* 
   1. 新建两张物理表
   2. 分别向表中插入相应的数据
   3. 新建视图

   4. 执行删除视图中的数据
   5. 查看物理表中的数据

   6. 删除视图、删除基础表
   */
create table [maomao365.com_A]
(keyIdA int,infoA nvarchar(30))

create table [maomao365.com_B]
(keyIdB int,infoB nvarchar(30))
go

insert into [maomao365.com_A]
(keyIdA,infoA)values
(1,'sqlblog'),(2,N'sql教程'),
(10,'s')
go
insert into [maomao365.com_B]
(keyIdB,infoB)values
(1,'sqlblog'),(2,N'sql教程')
go

create view vw_maomao
as  
       select 
       a.keyIdA,a.infoA,
       b.keyIdB,b.infoB 
       from [maomao365.com_A] a
        left join 
        [maomao365.com_B] b 
        on a.keyIdA = b.keyIdB 
go


/*
删除数据出错,出现影响多个基表,禁止删除
*/
delete from vw_maomao 
where keyIdA =10 
go

/*
修改视图为子查询模式
*/
alter view vw_maomao
as 
 select a.keyIdA,a.infoA
  from [maomao365.com_A] a
    where a.keyIdA in 
    ( 
     select keyIdb from [maomao365.com_B]
    )     
       go

select * from vw_maomao 
print '--重新执行删除操作--'
delete from vw_maomao 
where keyIdA =1 
go

go 
drop     view  vw_maomao

go
truncate table  [maomao365.com_A]
drop     table  [maomao365.com_A]

go
truncate table  [maomao365.com_B]
drop     table  [maomao365.com_B]


从以上的例子,我们可以看出如果视图涉及多个表时,我们不能对视图执行delete操作,只有当视图中涉及一个基础表时,才可以对视图执行删除操作,
即视图同时删除多表数据的情况是不可能发生。

mssql sqlserver 视图操作注意事项


摘要:
下文讲述sqlserver 视图的相关知识和注意事项,如下所示:
实验环境:sql server 2008 R2


在sqlserver 中,当一个视图被定义后,我们可以像对待表查询一样对待视图查询。
但当我们对视图执行更新或删除操作,将受到相应的限制,如下所示:

1. 当视图由多表联接组合而成,当我们对视图执行更新和删除操作时,只可更新其中一张表;
2.当视图中存在group by 或聚合操作时,不能对视图执行更新和删除操作;
3.由于视图中可能不包含表所有字段,当我们对视图执行插入操作,可能出现null值;

   create  view vw_test   
    as        
     select  a.keyId,b.name as b,c.name as c, c.name as d     
     from  tableA as a,tableB as b,tableC   as c        
       WHERE a.keyId = b.keyId 
          and b.keyId=c.keyId 
    go 
 ---视图vw_test由三张表联接组成,当我们对视图进行insert操作
   insert into vw_test  values(1,'a','b','c','d')
   ---视图会提示相关错误信:"视图vw_test不可更新,因为修改涉及多个基表"
    create  view vw_test   
    as        
     select  a.keyId,count(a.name) as cnt      
      from  tableA as a 
      group by a.keyId 
     go
   ---由于视图中使用聚合操作,所以此视图不能进行增删改操作。