表9-40に、セッションやシステムの情報を抽出する関数を示します。
表 9-40. セッション情報関数
名前 | 戻り値の型 | 説明 |
---|---|---|
current_database () | name | 現在のデータベースの名前 |
current_schema () | name | 現在のスキーマの名前 |
current_schemas (boolean) | name[] | オプションで暗黙的なスキーマも含む、検索パス内のスキーマの名前 |
current_user | name | 現在の実行コンテキストのユーザ名 |
inet_client_addr () | inet | リモート接続のアドレス |
inet_client_port () | int | リモート接続のポート |
inet_server_addr () | inet | ローカル接続のアドレス |
inet_server_port () | int | ローカル接続のポート |
pg_my_temp_schema () | oid | セッションの一時スキーマのOID。もしなければ0です。 |
pg_is_other_temp_schema (oid) | boolean | スキーマが他のセッションの一時スキーマかどうか? |
pg_postmaster_start_time () | timestamp with time zone | サーバの起動時刻 |
session_user | name | セッションのユーザ名 |
user | name | current_user と等価 |
version () | text | PostgreSQLバージョン情報 |
session_user
は、通常、現在のデータベース接続を初期化したユーザです。しかし、スーパユーザはこの設定をSET SESSION AUTHORIZATIONを使用して変更することができます。current_user
は、権限の検査に適用されるユーザ識別子です。通常はセッションユーザと同じですが、SET ROLEを使用して変更可能です。SECURITY DEFINER属性を持つ関数の実行中にも変更します。Unix用語で言うと、セッションユーザは"実ユーザ"で、現在のユーザは"実効ユーザ"です。
注意:
current_user
、session_user
およびuser
はSQLにおいて特殊な状態を持っており、括弧を付けずに呼び出さなければなりません。
current_schema
関数は、検索パスの先頭にあるスキーマ名(もしくは、検索パスが空の場合はNULL値)を返します。これは、対象スキーマを指定せずに作成された、任意のテーブルまたは他の名前付きオブジェクトに使用されるスキーマです。また、current_schemas(boolean)
は、検索パスに存在する全てのスキーマ名の配列を返します。booleanオプションにより、pg_catalogのような暗黙的に含まれているシステムスキーマを、検索パスに含めて返すかどうかを指定します。
注意: 検索パスは、実行時の設定で変更することができます。使用するコマンドは以下の通りです。
SET search_path TO schema [, schema, ...]
inet_client_addr
は現在のクライアントのIPアドレスを返し、inet_client_port
はそのポート番号を返します。inet_server_addr
は、現在の接続を受け付けたサーバのIPアドレスを返し、inet_server_port
はそのポート番号を返します。
pg_my_temp_schema
は、現在のセッションの一時スキーマのOIDを返します。
もし(一時テーブルをまったく作成していないために)存在しなければ0を返します。
pg_is_other_temp_schema
は、指定したOIDが他のセッションの一時スキーマのOIDであれば、真を返します。
(例えば、他のセッションの一時テーブルをカタログ表示から除外したい場合などで有用です。)
pg_postmaster_start_time
はサーバが起動した時のtimestamp with time zoneを返します。
version
関数はPostgreSQLサーバのバージョンを記述した文字列を返します。
表9-41に列挙した関数を使用して、ユーザはオブジェクトのアクセス権限をプログラムから問い合わせることができます。権限についての詳細は、項5.6を参照してください。
表 9-41. アクセス権限照会関数
名前 | 戻り値型 | 説明 |
---|---|---|
has_database_privilege (user,
database,
privilege)
| boolean | ユーザにデータベースへのアクセス権限があるのか |
has_database_privilege (database,
privilege)
| boolean | 現在のユーザにデータベースへのアクセス権限があるのか |
has_function_privilege (user,
function,
privilege)
| boolean | ユーザに関数へのアクセス権限があるのか |
has_function_privilege (function,
privilege)
| boolean | 現在のユーザに関数へのアクセス権限があるのか |
has_language_privilege (user,
language,
privilege)
| boolean | ユーザに言語へのアクセス権限があるのか |
has_language_privilege (language,
privilege)
| boolean | 現在のユーザに言語へのアクセス権限があるのか |
has_schema_privilege (user,
schema,
privilege)
| boolean | ユーザがスキーマに対する権限を持つか |
has_schema_privilege (schema,
privilege)
| boolean | 現在のユーザがスキーマに対する権限を持つか |
has_table_privilege (user,
table,
privilege)
| boolean | ユーザはテーブルに対する権限を持つか |
has_table_privilege (table,
privilege)
| boolean | 現在のユーザはテーブルに対する権限を持つか |
has_tablespace_privilege (user,
tablespace,
privilege)
| boolean | ユーザにテーブル空間へのアクセス権限があるのか |
has_tablespace_privilege (tablespace,
privilege)
| boolean | 現在のユーザにテーブル空間へのアクセス権限があるのか |
pg_has_role (user,
role,
privilege)
| boolean | ユーザはロールに対する権限を持つか |
pg_has_role (role,
privilege)
| boolean | 現在のユーザはロールに対する権限を持つか |
has_database_privilege
関数は、あるユーザが特定の方法でデータベースにアクセス可能かどうかを検査します。
この関数での引数の使用方法は、has_table_privilege
に類似しています。
対象とするアクセス権限の種類は、CREATE、CONNECT、TEMPORARY、またはTEMP(TEMPORARYと同じ)で評価する必要があります。
has_function_privilege
関数は、あるユーザが特定の方法で関数にアクセス可能かどうかを検査します。この関数での引数の使用方法は、has_table_privilege
に類似しています。関数をOIDではなくテキスト文字列で指定した場合、regprocedure データ型(項8.12を参照)と同じ入力が可能です。対象とするアクセス権限の種類は、現在EXECUTEで評価する必要があります。以下に例を示します。
SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');
has_language_privilege
関数は、あるユーザが特定の方法で手続き言語にアクセス可能かどうかを検査します。この関数での引数の使用方法は、has_table_privilege
に類似しています。対象とするアクセス権限の種類は、現在USAGEで評価する必要があります。
has_schema_privilege
関数は、あるユーザが特定の方法でスキーマにアクセス可能かどうかを検査します。この関数での引数の使用方法は、has_table_privilege
に類似しています。対象とするアクセス権限の種類は、CREATEもしくはUSAGEで評価する必要があります。
has_table_privilege
はユーザが特定の方法でテーブルにアクセスできるかどうかを検査します。
ユーザは名前でもOID(pg_authid.oid)でも指定することができます。
この引数が省略された場合はcurrent_user
が使用されます。
テーブルは名前またはOIDで指定することができます。
(従って、has_table_privilege
には、引数の数や型で区別される6つの種類があることになります。)
名前で指定する場合、必要に応じてスキーマで修飾することができます。
求めるアクセス権限はテキスト文字列で指定します。
これはSELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGERのいずれかでなければなりません。
(しかし大文字小文字は区別されません。)
以下に例を示します。
SELECT has_table_privilege('myschema.mytable', 'select');
has_tablespace_privilege
関数は、あるユーザが特定の方法でテーブル空間にアクセス可能かどうかを検査します。この関数での引数の使用方法は、has_table_privilege
に類似しています。対象とするアクセス権限の種類は、CREATEで評価する必要があります。
pg_has_role
は、ユーザが特定の方法でロールにアクセスできるかどうかを検査します。
取り得る引数についてはhas_table_privilege
と同様です。
対象とするアクセス権限の種類は、 MEMBER、USAGEで評価する必要があります。
MEMBERは、ロールの直接または間接メンバ資格(つまり、SET ROLEを行う権限)を表します。
一方、USAGEは、そのロール権限がSET ROLEをしなkてもすぐに利用できることを表します。
ユーザがその権限のグラントオプションを保持しているかどうかを確認するためには、権限キーワードにWITH GRANT OPTIONを付けてください。例えば、'UPDATE WITH GRANT OPTION'です。
表9-42に、特定のオブジェクトが、現行スキーマの検索パスにおいて可視かどうかを判別する関数を示します。あるテーブルを含むスキーマが検索パス内に存在し、検索パス内の前方に同じ名前のテーブルがない場合、そのテーブルは可視であると言います。つまり、これは、テーブルが明示的なスキーマ修飾なしで名前によって参照可能であるということです。例えば、次のようにして、全ての可視テーブルの名前を列挙可能です。
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
表 9-42. スキーマ可視性照会関数
名前 | 戻り値型 | 説明 |
---|---|---|
pg_conversion_is_visible (conversion_oid)
| boolean | 変換が検索パスにおいて可視かどうか |
pg_function_is_visible (function_oid)
| boolean | 関数が検索パスにおいて可視であるか |
pg_operator_is_visible (operator_oid)
| boolean | 演算子が検索パスにおいて可視であるか |
pg_opclass_is_visible (opclass_oid)
| boolean | 演算子クラスが検索パスにおいて可視であるか |
pg_table_is_visible (table_oid)
| boolean | テーブルが検索パスにおいて可視かどうか |
pg_type_is_visible (type_oid)
| boolean | 型(またはドメイン)が検索パスにおいて可視かどうか |
pg_conversion_is_visible
、pg_function_is_visible
、pg_operator_is_visible
、pg_opclass_is_visible
、pg_table_is_visible
、pg_type_is_visible
は、変換、関数、演算子、演算子クラス、テーブル、型に関する可視性検査を行います。
pg_table_is_visible
がビュー、インデックス、シーケンスに対しても使用できること、pg_type_is_visible
がドメインに対しても使用できることに注意してください。
関数および演算子では、パスの前方に同じ名前かつ同じ引数のデータ型を持つオブジェクトが存在しなければ、検索パス内のオブジェクトは可視です。
演算子クラスでは、名前と関連するインデックスアクセスメソッドが考慮されます。
これらの関数は全て、検査するオブジェクトを識別するために、オブジェクトのOIDを必要とします。オブジェクトを名前でテストする場合、OID別名型(regclass、regtype、regprocedure、またはregoperator)を使用すると便利です。例えば、以下のようにします。
SELECT pg_type_is_visible('myschema.widget'::regtype);
ただし、このように修飾されていない名前をテストしても、あまり意味がないことに注意してください。名前が認識されれば、それは必ず可視ということになります。
表9-43に、システムカタログから情報を抽出する関数を列挙します。
表 9-43. システムカタログ情報関数
名前 | 戻り値型 | 説明 |
---|---|---|
format_type (type_oid, typemod) | text | データ型のSQL名の取得 |
pg_get_constraintdef (constraint_oid) | text | 制約の定義を取得 |
pg_get_constraintdef (constraint_oid, pretty_bool) | text | 制約の定義を取得 |
pg_get_expr (expr_text, relation_oid) | text | その中のどんなVarも、二番目のパラメータによって指定されるリレーションを参照すると仮定して、式の内部形式を逆コンパイル |
pg_get_expr (expr_text, relation_oid, pretty_bool) | text | その中のどんなVarも、二番目のパラメータによって指定されるリレーションを参照すると仮定して、式の内部形式を逆コンパイル |
pg_get_indexdef (index_oid) | text | インデックスのCREATE INDEXコマンドの取得 |
pg_get_indexdef (index_oid, column_no, pretty_bool) | text | インデックスのCREATE INDEXコマンドの取得。もしくはcolumn_noが非ゼロの場合は、1つのインデックス列のみの定義の取得 |
pg_get_ruledef (rule_oid) | text | ルールのためにCREATE RULEコマンドを取得 |
pg_get_ruledef (rule_oid, pretty_bool) | text | ルールのCREATE RULEコマンドを取得 |
pg_get_serial_sequence (table_name, column_name) | text | serialもしくはbigserial列が使用するシーケンス名の取得 |
pg_get_triggerdef (trigger_oid) | text | トリガのCREATE [ CONSTRAINT ] TRIGGERコマンドの取得 |
pg_get_userbyid (roleid) | name | 与えられたIDでロール名を取得 |
pg_get_viewdef (view_name) | text | ビューを(無視する)現在のSELECTコマンドを取得 |
pg_get_viewdef (view_name, pretty_bool) | text | ビューを(無視する)現在のSELECTコマンドを取得 |
pg_get_viewdef (view_oid) | text | ビューの現在のSELECTコマンドを取得 |
pg_get_viewdef (view_oid, pretty_bool) | text | ビューの現在のSELECTコマンドを取得 |
pg_tablespace_databases (tablespace_oid) | setof oid | テーブル空間内にオブジェクトを所有するデータベースのOID集合を取得 |
format_type
は、自身の型OIDとひょっとしたら型修飾子によって特定されるデータ型のSQL名を返します。特定の修飾子が既知でなければ型修飾子にNULLを渡します。
pg_get_constraintdef
、
pg_get_indexdef
、pg_get_ruledef
、
および pg_get_triggerdef
、それぞれ対応する制約、インデックス、ルール、もしくはトリガに対するコマンド作成を再構築します。(これはコマンドのオリジナルテキストではなく、逆コンパイルされた再構築であることに注意してください。)pg_get_expr
は、列のデフォルト値のような個々の式の内部形式を逆コンパイルします。システムカタログの内容を試験するときに便利です。 pg_get_viewdef
はビューを定義するSELECT問い合わせを再構築します。これらの関数のほとんどは2つの異形があり、そのうちの1つはオプションとして結果を"pretty print"(訳注:"見やすく表示")します。pretty printされた書式はより読みやすい半面、デフォルトの書式の方が今後のバージョンのPostgreSQLでも同様に解釈することができそうです。ダンプを目的とする場合は、見やすく表示する出力を使用しないでください。見やすい表示用のパラメータにfalseを渡すことで、このパラメータをまったく持たない種類の結果と同一の結果を生成します。
pg_get_serial_sequence
は、列に関連したシーケンスの名前を返します。
もし、列に関連したシーケンスが存在しなければ、NULLを返します。
最初の入力パラメータはテーブル名です。スキーマを付けることもできます。
2番目のパラメータは列名です。
最初のパラメータは普通スキーマとテーブルですので、二重引用符付の識別子としては解釈されません。つまり、デフォルトで小文字に変換されます。
一方2番目のパラメータは単なる列名であり、二重引用符付として解釈され、その大文字小文字は保持されます。
この関数は、シーケンス関数に渡すことができるよう適切な書式で値を返します。(項9.12を参照)
この関連付けはALTER SEQUENCE OWNED BYにより変更、削除することができます。
(この関数はおそらくpg_get_owned_sequence
から呼び出されるはずです。名前は、serialや bigserial列で実際に入力されたものが反映されます。)
pg_get_userbyid
はそのOIDで与えられたロールの名前を抽出します。
pg_tablespace_databases
によりテーブル空間の使用状況を確認することができます。これは、そのテーブル空間内に格納されたオブジェクトを持つデータベースのOIDの集合を返します。この関数が何らかの行を返した場合、このテーブル空間は空ではなく、そのため、削除することができませんテーブル空間内に格納された特定のオブジェクトを表示するためには、pg_tablespace_databases
で識別されたデータベースに接続し、そのpg_classカタログに問い合わせを行う必要があります。
表9-44に示される関数は、COMMENTコマンドによって以前に保存されたコメントを抽出します。 指定されたパラメータに一致するコメントが検出されない場合、NULL値が返されます。
表 9-44. コメント情報関数
名前 | 戻り値型 | 説明 |
---|---|---|
col_description (table_oid, column_number) | text | テーブル列のコメントを取得 |
obj_description (object_oid, catalog_name) | text | データベースオブジェクトのコメントを取得 |
obj_description (object_oid) | text | データベースオブジェクトのコメントを取得(廃止予定) |
shobj_description (object_oid, catalog_name) | text | 共有データベースオブジェクトのコメントを取得 |
col_description()
関数は、テーブルのOIDとその列番号で指定されるテーブルの列のコメントを返します。obj_description()
関数は、テーブル列自体がOIDを所有していませんので、テーブル列に対して使用することはできません。
obj_description()
関数の2つのパラメータを取る形式はそのOIDと保有しているシステムカタログの名前で指定されたデータベースオブジェクトのコメントを返します。例えば、obj_description(123456,'pg_class')はOID 123456を持つテーブルのコメントを抽出します。obj_description()
関数の単一パラメータ形式はオブジェクトのOIDのみ必要とします。異なったシステムカタログに渡ってOIDが一意である保証はないことから現在は使われません。ですから、間違ったコメントが返ることがあります。
shobj_description
はobj_description
と同じように使用されますが、共有オブジェクトのコメント取得のために使用されます。
一部のシステムカタログは、各クラスタ内のデータベース全体に対して大域的です。
これらのコメントも同様に大域的に格納されます。