可更新的视图()
示例说明
在BOOKS表中除了BK_ID列被定义为主键列之外其他所有列都允许NULL值上面例子中创建的vwBookPrices视图是基于单个表的(BOOKS表)它允许更新BK_TITLE列和BK_PRICE列并允许插入新记录该视图还支持删除记录实际上如果不是由于参照完整性的限制不允许在最子层表中出现孤立记录我们将可以通过视图删除BOOKS表中的所有记录
WITH CHECK OPTION
通过视图添加修改和删除数据的功能也带来了新的问题对于通过视图插入的数据与通过视图显示出来的数据如何才能确保两者之间的一致性呢?
假设在前面的练习中当创建视图时添加了一个约束条件将视图限制为只显示BK_ID小于或等于的图书
CREATE VIEW vwBookPricesFirst
AS SELECT
bk_id
bk_title
bk_price
FROM books
WHERE bk_id <=
尽管如此只需要采用与上面的练习中非常类似的步骤就可以通过视图插入新记录例如插入一条BK_ID=的新记录没有任何东西阻止这种插入操作这时通过视图查看记录的结果就会不同因为该视图定义了只显示BK_ID <= 的记录
除非读者故意要实现这样的功能否则很可能希望看到通过视图插入到表中的数据或者首先阻止无效的数据通过视图插入到表中要实现这样的功能请使用CHECK OPTION
只需要将WITH CHECK OPTION添加到视图的定义中当想插入视图无法显示的数据时该语句将抛出一个异常下面是Microsoft SQL Server对此作出的反应
CREATE VIEW vwBookPricesFirst
AS SELECT
bk_id
bk_title
bk_price
FROM books
WHERE bk_id <=
WITH CHECK OPTION;
INSERT INTO vwBookPricesFirst(bk_id) VALUES ()
Msg Level State Line
The attempted insert or update failed because the target view either
specifies WITH CHECK OPTION or spans a view that specifies WITH CHECK OPTION
and one or more rows resulting from the operation did not qualify under
the CHECK OPTION constraint
The statement has been terminated
请注意这对于直接更新BOOKS表中的数据并没有任何影响它只是对视图施加了限制因为该视图无法显示BK_ID大于的记录
在入口处检查数据将带来严重的性能损失因此应该谨慎使用
CHECK OPTION是SQL标准的一部分所有具有可更新视图功能的RDBMS都支持使用它包括OracleMySQLMicrosoft SQL Server和IBM DB
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程