WITH CHECK OPTION 付きビュー
表 社員 の所有者である DB 管理者が次の SQL 文を実行し,ビュー 営業部社員 を定義して利用者 S に権限を付与した。S は表 社員 に対する権限をもたない。表 社員 には,部署が '営業' の社員 E01 と,部署が '開発' の社員 E50 の行がある。S が SQL 文を実行したときの結果として,適切なものはどれか。ここで,営業部社員 は更新可能なビューである。
CREATE VIEW 営業部社員 AS
SELECT 社員番号, 氏名, 部署, 内線
FROM 社員
WHERE 部署 = '営業'
WITH CHECK OPTION;
GRANT SELECT, UPDATE ON 営業部社員 TO S;- アUPDATE 営業部社員 SET 内線 = '5555' WHERE 社員番号 = 'E50' を実行すると,E50 の行がビューの条件を満たさないので,WITH CHECK OPTION によってエラーとなる。
- イS は表 社員 に対する UPDATE 権限をもたないので,ビューを介した UPDATE 文は全て権限不足で拒否される。
- ウビューの内容はビューを定義した時点の表 社員 の行で固定されるので,その後に営業部へ異動した社員の行は S から参照できない。
- エUPDATE 営業部社員 SET 部署 = '開発' WHERE 社員番号 = 'E01' を実行すると,更新後の行がビューの条件を満たさなくなるので,この UPDATE 文は拒否される。
正解と解説を見る
正解 エ
この問題の基礎知識
- ビューは問合せの定義を保存した仮想的な表であり,参照されるたびに定義の問合せが実行される。結果を実データとして保持するのは実体化ビュー(マテリアライズドビュー)である。
- 更新可能なビューを介した UPDATE 文や DELETE 文は,ビューの WHERE 句の条件を満たす行,すなわちビューから見える行だけを対象とする。
- WITH CHECK OPTION を指定すると,ビューを介した INSERT 文や UPDATE 文で作られる行がビューの条件を満たすかが検査され,満たさない変更は拒否される。
- ビューに対する権限を付与すると,利用者は基になる表への権限をもたなくても,ビューで定めた範囲だけにアクセスできる。ビューはアクセス制御の手段として使われる。
ビューの WHERE 句の条件は,ビューを介した UPDATE 文で更新できる行を限定する。E50 の行はビューから見えないので更新の対象にならず,エラーではなく更新件数 0 件で終わる。WITH CHECK OPTION が検査するのは更新後の行である。
ビューが参照する表へのアクセス権限は,ビューを使う利用者ではなくビューの所有者の権限で検査される。所有者の DB 管理者は表 社員 の権限をもつので,S はビューの UPDATE 権限だけで,ビューを介して営業部の行を更新できる。
ビューは問合せの定義を保存するもので,参照されるたびに定義の問合せが実行される。定義後に部署が '営業' に変更された社員の行も S から参照できる。定義時点などの結果を保持するのは実体化ビュー(マテリアライズドビュー)である。
WITH CHECK OPTION を指定した更新可能なビューでは,ビューを介した INSERT 文や UPDATE 文で作られる行がビューの条件を満たすかを検査し,満たさない場合は拒否する。指定がなければ,E01 を営業部の外へ移してビューから見えなくする更新ができてしまう。
照合の根拠(4 件)
- エ(正解): WITH CHECK OPTION では更新後の行がビューの条件を満たさない UPDATE は拒否される(製品ドキュメント)
commands on the view will be checked to ensure that new rows satisfy the view-defining condition (that is, the new rows are checked to ensure that they are visible through the view). If they are not, the update will be rejected.
PostgreSQL Documentation: CREATE VIEW · Parameters: WITH CHECK OPTION(ref/create_view.sgml)(新しいタブで開きます) - ア(誤り): ビューの WHERE 条件は UPDATE の対象行を限定するので,E50 は更新対象にならずエラーにはならない(製品ドキュメント)
If an automatically updatable view contains a WHERE condition, the condition restricts which rows of the base relation are available to be modified by UPDATE , DELETE , and MERGE statements on the view.
PostgreSQL Documentation: CREATE VIEW · Notes: Updatable Views(ref/create_view.sgml)(新しいタブで開きます) - イ(誤り): 既定では基底表の権限はビューの所有者に必要で,更新する利用者には不要(製品ドキュメント)
In addition, by default, the view's owner must have the relevant privileges on the underlying base relations, whereas the user performing the update does not need any permissions on the underlying base relations
PostgreSQL Documentation: CREATE VIEW · Notes: Updatable Views(ref/create_view.sgml)(新しいタブで開きます) - ウ(誤り): ビューは実体化されず参照のたびに問合せが実行されるので,定義後に営業部へ異動した社員の行も見える(製品ドキュメント)
The view is not physically materialized. Instead, the query is run every time the view is referenced in a query.
PostgreSQL Documentation: CREATE VIEW · Description(ref/create_view.sgml)(新しいタブで開きます)
ISO/IEC 9075 本文は有償で読めないため PostgreSQL の文書で裏付けた。イの「所有者の権限で検査」は PostgreSQL の既定(security_invoker = false)の動作として記述されている。