数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

SQL实战新手入门:可更新的视图(2)


发布日期:2019年05月03日
 
SQL实战新手入门:可更新的视图(2)

可更新的视图(

示例说明

在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

数据仓库与数据挖掘培训视频教程

上一篇:高手详解SQL性能优化十条经验

下一篇:SQL实战新手入门:分层的视图