今回は、Silverの「S2 運用管理 - S2.5 基本的な運用管理作業(テーブル単位の権限)」からの出題です。
テーブルの所有者は、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です。
例題解説についてのご質問やご意見は以下からご連絡ください。
※本例題および解説は、例題作成者から提供されたものです。実際の試験問題とは異なります。
※実際の試験問題に関するお問い合わせについてはご回答いたしかねます。あからじめご了承ください。
© EDUCO All Rights Reserved.