对视图进行数据更新问题的学习
一、原理
对视图查询实际上是对表的查询,通过将视图实体化来实现
◆ 实体化视图(View Materialization)步骤:
n 有效性检查:检查所查询的视图是否存在
n 执行视图定义,将视图临时实体化,生成临时表
n 查询视图转换为查询临时表
n 查询完毕删除被实体化的视图(临时表)
视图是可以进行insert、update、delete操作(统称为更新)的,对视图进行更新操作,DBMS会通过视图消解法转换为对表的更新操作。
u 视图消解法(View Resolution)执行步骤:
u 有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义。
u 把视图定义中的子查询与用户的查询结合起来,转换成等价的对基本表的查询。
n 执行修正后的查询。
n 视图消解法的局限:有些情况下,视图消解法不能生成正确查询。采用视图消解法的DBMS会限制这类查询。
二、小结
有些视图可以通过视图消解法完成更新操作,有些则不可以,下面的示例演示了定义视图时增加“With Check Option”后导致的区别,先总结一下:
增加With Check Option选项会导致在更新语句的基础上增加视图中的where条件,所以导致的更新失败较多。
三、示例
例1:通过视图插入数据(成功的)
1)视图定义
2)通过视图更新Categories表
3)通过视图更新Products表
注意:视图定义中where语句指定了CategoryID为1,但是向Categories表和Products表添加数据时均不会受此查询条件的影响。
例2:通过视图插入数据(失败的,由于设置了WITH CHECK OPTION )
1)视图定义
2)通过视图更新Categories表(失败)
3)通过视图更新Products表
a)失败的
b)成功的