ビューの管理26

以下のビューに対して UPDATE 文を実行するとどうなりますか。

CREATE VIEW emp_dept10 AS
SELECT employee_id, last_name, department_id
FROM employees
WHERE department_id = 10
WITH CHECK OPTION;
 
UPDATE emp_dept10
  SET department_id = 20
 WHERE employee_id = 100;
    

A正常に更新され、従業員100の部署が20になる
Bエラーになり、更新は行われない
C更新はされるが、ビューから見えなくなるだけで警告は出ない
Dビューは読み取り専用なので、そもそも UPDATE できない
解説正答:B

WITH CHECK OPTION を付けたビューは、ビューのWHERE条件を満たさなくなるDML(INSERT / UPDATE)を禁止 します。

このビューは department_id = 10 の行だけを対象としています。department_id20 に更新すると、その行はビューの条件から外れて ビュー経由で見えなくなる ため、許可されずエラーになります(ORA-01402: ビューのWITH CHECK OPTION句に違反しています)。

WITH CHECK OPTION のポイント:

  • ビューを通したDMLの結果が、引き続きそのビューで参照できることを保証する。
  • WHERE条件で絞った列の値を、条件の外へ変更しようとすると失敗する。

比較:READ ONLY との違い

指定SELECTINSERT / UPDATE / DELETE
(指定なしの単純ビュー)全て可
WITH CHECK OPTIONビュー条件を満たす範囲のみ可
WITH READ ONLYすべて不可

もしこのビューが WITH READ ONLY で定義されていれば、選択肢Dのとおりそもそも UPDATE 自体ができません(ORA-42399)。