使用 WITH CHECK OPTION 关键字

可以将不满足视图条件的行(也就是无法通过视图进行查看的行)插入到视图中。还可以更新视图的行,以使其不再满足视图的条件。

要避免将某个视图的某一行更新为使其不再满足视图的条件,请在创建视图时添加 WITH CHECK OPTION 关键字。该子句要求数据库服务器对插入或更新的每一行进行测试,以确保其符合视图的 WHERE 子句设置的条件。如果不符合条件,那么数据库服务器将拒绝该操作,并显示错误。
限制: 当视图定义中包含 UNION 运算符时,不能包括 WITH CHECK OPTION 关键字。
在前一个示例中,名为 response 的视图是按以下示例所示的方式定义的:
CREATE   VIEW   response (user_id, received,  resolved,  duration) AS
      SELECT user_id,call_dtime,res_dtime,res_dtime  - call_dtime
            FROM cust_calls
            WHERE user_id = USER
可以更新视图的 user_id 列,如以下示例所示:
UPDATE response SET user_id = 'lenora'
      WHERE received BETWEEN TODAY AND TODAY - 7
视图需要 user_id 等于 USER 的行。如果用户 tony 执行此更新,那么更新后的行将从视图中消失。然而,可以如下例所示创建视图:
CREATE   VIEW    response  (user_id, received, resolved,duration) AS
      SELECT user_id, call_dtime, res_dtime, res_dtime - call_dtime
            FROM cust_calls
            WHERE user_id = USER
WITH CHECK OPTION

用户 tony 所作的上述 UPDATE 操作被当作错误而遭到拒绝。

可使用 WITH CHECK OPTION 功能来强制实施任何类型的可作为布尔表达式来表示的数据约束。在以下示例中,您可以创建表的视图,对于此视图,把对数据的所有逻辑约束都表达为 WHERE 子句的条件。然后,可以要求对该表所作的所有修改都通过该视图进行。
CREATE VIEW order_insert AS
      SELECT * FROM orders O
            WHERE order_date = TODAY -- no back-dated entries
                  AND EXISTS -- ensure valid foreign key
                        (SELECT * FROM customer C
                              WHERE O.customer_num = C.customer_num)
                  AND ship_weight < 1000 -- reasonableness checks
                  AND ship_charge < 1000
WITH CHECK OPTION

由于需要执行 EXISTS 和其他测试(当数据库服务器检索现有行时,这些测试应该能成功),此视图显示 orders 中数据的效率不高。然而,如果对 orders 执行的插入操作只通过此视图进行(并且还没有使用完整性约束来约束数据),那么用户无法插入延期订单、无效的客户号或过高的装运重量和运费。