数据库视图详解
执行视图:
保护视图:
with check option导致视图where自居不但筛选检索的数据,还在通过视图插入和更新数据时进行检查。即进行双向限制。
在创建视图的时候,如果在management stdio设计器中进行创建,如果在属性窗口中启用了with schemabinding(绑定到架构)选项。那么我们在修改表的结构的时候,系统就会提示无法修改,系统就会保护视图
我们所创建的视图的代码都可以再系统表中找到:存储在SysComments中
eg:select Text from SysComments
join SysObjects on SysObjects.ID=SysComments.ID
where Name='ViewName'
即可得到ViewName的源代码
但是如果我们在创建视图的时候加上了with encryption的话,就无法得到源代码 ,而是一堆乱码
不过值得注意的是,如果加了这个限制之后,我们就无法修改这个视图了。
通过视图进行更新:
人们经常抱怨,不能通过视图来更新数据。事实上,除非视图包含的是简单的select语句,否则不能通过它来实现数据的更新
下列因素将导致视图不可更新:
1.只能更新一个表。如果视图使用了连接,引用视图的update语句只能跟新其中的一个表
2.针对视图或基表的instead of触发器将改变数据修改操作,在这种情况下,将执行instead of触发器中的代码,而不执行提交的数据更新
3.如果试图包含聚合函数或group by子句,视图将是不可更新的,因为sql server无法确定应更新那些被汇总的行
4.如果视图使用自查询来提供派生表,视图输出将不包含该派生表中的任何列。然而可以再用作派生表的子查询中使用聚合函数
5.如果试图包含with check option,则insert和update操作必须满足视图的where子句指定的条件
6.执行insert或update操作时,指定的列必须在基表中是唯一的。如果两个表包含名称相同的列,必须指定列时使用table.column表示法
交叉参考:一种规避视图不可更新限制的方法是创建一个instead of触发器,它检查要更新的数据,并根据这些数据执行合法的update操作