「S3 開発/SQL - S3.1 SQL コマンド(スキーマ)」からの出題です。
=> show search_path;
search_path
-----------------
"$user", public
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2022年4月20日
PostgreSQLでは、データベースクラスタ内に複数のデータベースがあり、データベース内にはいくつかのスキーマがあり、テーブルなどのオブジェクトは何らかのスキーマに属する、という構造になっているので、SELECT文などでテーブル名を指定するとき、構文的には
SELECT ... FROM データベース名.スキーマ名.テーブル名 ...
のようにデータベース名とスキーマ名をテーブル名の前に付加することを許容しています。
ただし、実際には接続中のデータベース以外へのアクセスを許容しておらず、他のデータベース名を指定するとエラーになるため、現実的には「スキーマ名.テーブル名」の形式で指定するか、あるいはスキーマ名も省略してテーブル名だけを指定するかのどちらかになります。
テーブル名を「スキーマ名.テーブル名」の形式で指定する場合、そのテーブルにSELECT権限だけあれば足りるように思うかもしれませんが、指定したスキーマ内にその名前のテーブルが存在するかどうかの確認などのために、スキーマ自体のUSAGE権限も必要になることに注意してください。
スキーマ名を省略した場合、どのスキーマにあるテーブルを使用するかはスキーマ検索パスによって決定されます。スキーマ検索パスは本問の冒頭にある通り、show search_path で調べることができますが、デフォルトでは、ユーザ名と同じスキーマ、publicスキーマ、という優先順位になります。ユーザ名が foo の場合、SELECT * FROM bar は、スキーマ foo にテーブル bar があるならば、foo.bar からSELECTします。また、foo に bar がなく、publicスキーマにテーブルbarがあれば、public.barからSELECTしますが、どちらもなければエラーになります。一方で SELECT * FROM foo.bar は foo.bar があればそこからSELECT、なければエラーなので、少し動作が異なります。一見すると直感的に同じに思えてしまうかもしれませんので、注意してください。
従って正解はBとDです。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.