SPL プログラムでは、すべてのデータベースオブジェクトリファレンスは、修飾名 または 非修飾名 のいずれかです。
修飾名 —
schema.name。スキーマが明示されているため、リファレンスは曖昧さを含まず、対象オブジェクトはそのスキーマ内に存在するか、存在しないかのいずれかです。非修飾名 —
nameのみで、schema.プレフィックスを含まない形式です。データベースは、現在のユーザーの検索パス(search path)を順に検索することで、この名前を解決します。
非修飾名の解決手順
非修飾名をリファレンスすると、PolarDB は「検索パス」と呼ばれるスキーマのリストを左から順に検索します。セッションにおける現在のユーザーが決定されると、そのユーザーには常にデフォルトの検索パスが関連付けられます。リスト内のどのスキーマにも一致するオブジェクトが見つからない場合、リファレンスは失敗します。
現在の検索パスを確認するには、psql で以下のコマンドを実行します:
SHOW search_path;実行例:
search_path
-----------------
"$user", public
(1 row)$user は、現在のセッションユーザーを表すプレースホルダーです。現在のユーザーが polardb の場合、PolarDB はまず polardb スキーマを検索し、次に public スキーマを検索します。
非修飾名が特定のオブジェクトに解決された後、PolarDB は、現在のユーザーがそのオブジェクトに対して要求された操作を実行するのに必要な権限(privilege)を有しているかどうかを確認します。
Oracle 互換性に関する注意事項
Oracle には検索パスの概念が存在しません。Oracle では、非修飾リファレンスは常に現在のユーザー自身のスキーマのみを対象とします。これは、Oracle においてユーザーとスキーマが同一のエンティティであるためです。たとえば、hr ユーザーは hr スキーマを所有しており、hr.employees はそのスキーマ内の employees テーブルを指します。したがって、Oracle の修飾名は username.object_name というパターンに従います。
PolarDB for PostgreSQL(Oracle 互換モード)では、ユーザーとスキーマは別個のオブジェクトです。hr という名前のユーザーが自動的に hr という名前のスキーマを持つわけではありません。PolarDB for PostgreSQL(Oracle 互換モード)で Oracle 風の名前解決を再現するには、各ユーザーごとに専用のスキーマを作成し、検索パスを適切に設定してください。