针对视图,oracle提供了check option选项,以保证视图数据的完整性。本节将从以下几个方面分析with check option选项。
1、with check option 仅在视图定义中含有where子句的情况下起作用。
with check option 选项可以保证视图数据完整性。
例子:首先修改视图vw_employees的定义----只选择员工ID大于3的记录,同时使用with check option选项,响应的SQL语句如下所示。
SQL>create or replace view vw_employees as
select employee_id, employee_name, employee_position from employees
where employee_id >3
with check option;
其中,select employee_id、employee_name 和employee_position from employees where employee_id >3用于定义视图查询-----选择表employees中employee_id大于3的记录。此时,可以查询视图中的数据,响应的SQL语句如下所示。
select * from vw_employees;
2、with check option 选项仅对insert/update操作有效。
with check option 选项并非对所有DML操作均起作用,而只针对insert/update 操作有效。在试验了update操作之后,可以再次测试对insert操作的影响。
例子:尝试向视图vw_employees中,插入employee_id为2的数据。
SQL>insert into vw_employees values(2, '李四', '测试工程师');
3、with check option 选项实际创建了一个约束
with check opiton 选项实际为视图创建了一个约束。约束是对表或视图中的数据进行限制的一种数据库对象。关于约束的详细信息。
例子:oracle提供了数据字典user_constraints,该视图可以查看用户创建的所有约束。通过该视图,可以查询到with check option所创建的约束。
4、总结with check option选项
通过前面的介绍可知,with check option 实际为视图创建了一个约束,而该约束的检查依据为where 子句中的条件。当修改视图中的数据时,oracle将会判断修改后的数据是否违反了该约束。如果违反约束将抛出错误,并禁止修改。因此,对于视图vw_employees,当尝试修改employee_id列的值为3或插入employee_id列值为2的数据时,都将违反约束employee_id>3,并且导致修改失败;反之,对视图数据的修改将能够成功完成。
同理,由于删除语句总是针对整条记录,因此,删除操作不会违反employee_id>3,的约束,当然,无论where 子句中使用了何种条件,with check option 所创建的约束都不会对删除产生影响。这也是with check option 选项仅对insert/update操作起作用的原因了。