今回は、Silverの「運用管理 - 基本的な運用管理作業(テーブル単位の権限)」からの出題です。
テーブルの所有者は、SELECT権限をREVOKEされてもテーブルからデータをSELECTすることができる。
スーパーユーザは、SELECT権限をREVOKEされてもテーブルからデータをSELECTすることができる。
SELECTとUPDATEなど複数の権限を付与するときに、1つのGRANT文で複数の権限をまとめて指定することができる。
テーブルを更新するにはテーブルのデータを読む必要があるので、UPDATE権限をGRANTするだけで、自動的にSELECT権限もGRANTされる。
あるテーブルについてINSERT権限がGRANTされているが、SELECT権限がGRANTされていないという場合、他のユーザがINSERTしたデータはSELECTできないが、自分がINSERTしたデータはSELECTできる。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2018年10月9日
データベースでは、テーブルあるいはテーブルの列についてのSELECT、INSERT、UPDATE、DELETEなどの権限をユーザごとに細かく制御することができますが、デフォルトではテーブルの作成者(所有者)のみがすべての権限を所持しており、他のユーザは一切の権限を所持していません。
アクセスを許可するにはGRANT、許可したアクセス権限を取り消すにはREVOKEを使います。
PostgreSQLでは、テーブルの所有者からアクセス権限をREVOKEすることができます(データベースの種類によっては、所有者の権限はREVOKEできません)。SELECT権限をREVOKEされたら、所有者でもそのテーブルのデータをSELECTすることはできません。ただし、所有者はGRANTコマンドを実行することができるので、自分に対して GRANT SELECT を実行すれば、再び SELECT できるようになります。
スーパーユーザは特殊なユーザで、アクセス権限がなくても、テーブルにアクセスすることができます。スーパーユーザから SELECT 権限を REVOKE するコマンド自体は成功しますが、スーパーユーザはそれでもそのテーブルから SELECT を実行することができます。
複数の権限をまとめて付与するには、権限をカンマで区切って
GRANT SELECT, UPDATE ON table_name TO user_name;
のようにします。GRANT可能なすべての権限を一括して付与するには、
GRANT ALL ON table_name TO user_name;
のようにすることも可能です。
データを更新する典型的なSQL文は
UPDATE table_name SET column_name1 = value1 WHERE column_name2 = value2;
のような形式ですが、この場合、単にテーブル(あるいは更新対象列)に対するUPDATE権限だけでなく、WHERE句で参照する列についてのSELECT権限も必要となります。しかし、GRANTでUPDATEを許可しても、自動的に他の権限が付与されることはなく、SELECT権限も明示的に付与しなければなりません。なお、テーブルの全行を更新するのであれば、WHERE句を付けずに、
UPDATE table_name SET column_name1 = value;
のようにすると、UPDATE権限だけあればテーブルを更新できます。もちろん、valueとして、テーブルの列を参照するような式を記述するなら、SELECT権限が必要になります。
GRANT/REVOKEで付与する、あるいは取り消す権限はテーブル、あるいはテーブルの列が対象で、行単位の権限はありません。また、各行についてどのユーザが作成したか、という情報は存在しません。自分がINSERTした行であっても、テーブルのSELECT権限がなければSELECTすることはできません。
したがって正解はBとCです。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.