以下のビューに対して 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;
以下のビューに対して 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 に更新すると、その行はビューの条件から外れて ビュー経由で見えなくなる ため、許可されずエラーになります(ORA-01402: ビューのWITH CHECK OPTION句に違反しています)。
WITH CHECK OPTION のポイント:
- ビューを通したDMLの結果が、引き続きそのビューで参照できることを保証する。
- WHERE条件で絞った列の値を、条件の外へ変更しようとすると失敗する。
比較:READ ONLY との違い
| 指定 | SELECT | INSERT / UPDATE / DELETE |
|---|---|---|
| (指定なしの単純ビュー) | ○ | 全て可 |
| WITH CHECK OPTION | ○ | ビュー条件を満たす範囲のみ可 |
| WITH READ ONLY | ○ | すべて不可 |
もしこのビューが WITH READ ONLY で定義されていれば、選択肢Dのとおりそもそも UPDATE 自体ができません(ORA-42399)。