ビューの管理45 / 50 問

以下のビューに対して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_idを20に更新すると、その行はビューの条件から外れてビュー経由で見えなくなるため、許可されずエラーになります。
WITH CHECK OPTIONのポイント

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

比較:READ ONLYとの違い

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

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

前後の問題