以下のビューに対して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との違い
| 指定 | SELECT | INSERT / UPDATE / DELETE |
|---|---|---|
| (指定なしの単純ビュー) | ○ | 全て可 |
| WITH CHECK OPTION | ○ | ビュー条件を満たす範囲のみ可 |
| WITH READ ONLY | ○ | すべて不可 |
もしこのビューがWITH READ ONLYで定義されていれば、選択肢DのとおりそもそもUPDATE自体ができません(ORA-42399)。