PREPARATION
受験対策

Silverの例題解説
「開発/SQL - SQL コマンド(スキーマ)」

「開発/SQL - SQL コマンド(スキーマ)」からの出題です。

例題

3.138

show search_path の結果は以下の通りであるものとする。

=> show search_path;
   search_path
-----------------
 "$user", public

このとき、SELECT * FROM foo.bar; の実行について、最も適切な説明を2つ選びなさい。


  1. データベース foo 内にあるテーブル bar の内容を表示する。
  2. スキーマ foo 内にあるテーブル bar の内容を表示する。
  3. ユーザ foo が所有するテーブル bar の内容を表示する。
  4. 実行にあたり、fooのUSAGE権限とbar のSELECT権限の両方が必要である。
  5. ユーザ foo が実行する場合は、SELECT * FROM bar; と必ず同じ結果になる。

※この例題は実際の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事務局ではお応えできませんのでご了解ください。

企業の基幹システムや業務システムでの
OSS-DBの採用がますます拡大している中、
昇格・昇給・就職・転職に必ず役立つ認定です

OSS-DBの受験対策について

受験の学習をサポートする情報や対策に役立つ情報をご紹介

サンプル問題/例題解説

例題 のアーカイブを試験ごとにまとめています。OSS-DB技術者認定試験の学習にお役立てください

学習教材・教育機関のご紹介

OSS-DB認定教材や教育機関について詳しくご説明いたします。

無料技術解説セミナー

受験準備をされていらっしゃる方々を対象に、無料技術解説セミナーの日程をお知らせしています。

OSS-DB道場

受験準備をされていらっしゃる方々を対象に、無料技術解説セミナーの日程をお知らせしています。

関連資格