他のバージョンの文書9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

9.19. システム情報関数

表9-39に、セッションやシステムの情報を抽出する関数を示します。

表 9-39. セッション情報関数

名前戻り値の型説明
current_database()name現在のデータベースの名前
current_schema()name現在のスキーマの名前
current_schemas(boolean)name[]オプションで暗黙的なスキーマも含む、検索パス内のスキーマの名前
current_username現在の実行コンテキストのユーザ名
inet_client_addr()inetリモート接続のアドレス
inet_client_port()intリモート接続のポート
inet_server_addr()inetローカル接続のアドレス
inet_server_port()intローカル接続のポート
session_usernameセッションユーザ名
pg_postmaster_start_time()timestamp with time zonepostmaster開始時刻
usernamecurrent_userと等価
version()textPostgreSQLバージョン情報

session_userは、通常、現在のデータベース接続を初期化したユーザです。しかし、スーパユーザはこの設定をSET SESSION AUTHORIZATIONを使用して変更することができます。current_userは、権限の検査に適用されるユーザ識別子です。通常はセッションユーザと同じですが、SET ROLEを使用して変更可能です。SECURITY DEFINER属性を持つ関数の実行中にも変更します。Unix用語で言うと、セッションユーザは"実ユーザ"で、現在のユーザは"実効ユーザ"です。

注意: current_usersession_userおよびuserSQLにおいて特殊な状態を持っており、括弧を付けずに呼び出さなければなりません。

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_postmaster_start_timepostmasterが起動した時にtimestamp with time zoneを返します。

version関数はPostgreSQLサーバのバージョンを記述した文字列を返します。

表9-40に列挙した関数を使用して、ユーザはオブジェクトのアクセス権限をプログラムから問い合わせることができます。権限についての詳細は、項5.6を参照してください。

表 9-40. アクセス権限照会関数

名前戻り値型説明
has_table_privilege(user, table, privilege) booleanテーブルにユーザのアクセス権限があるのか
has_table_privilege(table, privilege) booleanテーブルに現在のユーザのアクセス権限があるのか
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現在のユーザに言語へのアクセス権限があるのか
pg_has_role(user, role, privilege) booleanユーザがロールに対して権限を所有しているか
pg_has_role(role, privilege) boolean現在のユーザがロールに対して権限を所有しているか
has_schema_privilege(user, schema, privilege) booleanユーザにスキーマへのアクセス権限があるのか
has_schema_privilege(schema, privilege) boolean現在のユーザにスキーマへのアクセス権限があるのか
has_tablespace_privilege(user, tablespace, privilege) booleanユーザにテーブル空間へのアクセス権限があるのか
has_tablespace_privilege(tablespace, privilege) boolean現在のユーザにテーブル空間へのアクセス権限があるのか

has_table_privilege関数は、あるユーザが特定の方法でテーブルにアクセス可能かどうかを検査します。ユーザは名前またはOID(pg_authid.oid)によって特定されます。もし引数が省略されるとcurrent_userとみなされます。テーブルは名前またはOIDによって特定できます(したがって、実際has_table_privilegeには6個の種類が存在し、それぞれの引数の数と型によって見分けられます)。名前で指定された場合、必要であれば、その名前をスキーマで修飾することが可能です。対象とするアクセス権限の種類はテキスト文字列で指定され、SELECTINSERTUPDATEDELETERULEREFERENCES、またはTRIGGERのうちの1つの値に評価されなければなりません(しかし、文字列の大文字小文字の違いは意味がありません)。以下に例を示します。

SELECT has_table_privilege('myschema.mytable', 'select');

has_database_privilege関数は、あるユーザが特定の方法でデータベースにアクセス可能かどうかを検査します。この関数での引数の使用方法は、has_table_privilegeに類似しています。対象とするアクセス権限の種類は、CREATETEMPORARY、またはTEMPTEMPORARYと同じ)で評価する必要があります。

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で評価する必要があります。

pg_has_roleはユーザが独特の方法でロールにアクセスできるかどうかを検査します。その引数に対して可能となるものはhas_table_privilegeと類似しています。望ましいアクセス権限型はMEMBERもしくはUSAGEと評価しなければなりません。MEMBERはロールの中で直接、もしくは間接的なメンバーシップを表し(つまり、SET ROLEを行う権利)、USAGESET ROLEを行わなくてもロール権限が直ちに有効になるかどうかを示します。

has_schema_privilege関数は、あるユーザが特定の方法でスキーマにアクセス可能かどうかを検査します。この関数での引数の使用方法は、has_table_privilegeに類似しています。対象とするアクセス権限の種類は、CREATEもしくはUSAGEで評価する必要があります。

has_tablespace_privilege関数は、あるユーザが特定の方法でテーブル空間にアクセス可能かどうかを検査します。この関数での引数の使用方法は、has_table_privilegeに類似しています。対象とするアクセス権限の種類は、CREATEで評価する必要があります。

ユーザがその権限のグラントオプションを保持しているかどうかを確認するためには、権限キーワードに WITH GRANT OPTIONを付けてください。例えば、'UPDATE WITH GRANT OPTION'です。

表9-41に、特定のオブジェクトが、現行スキーマの検索パスにおいて可視かどうかを判別する関数を示します。あるテーブルを含むスキーマが検索パス内に存在し、検索パス内の前方に同じ名前のテーブルがない場合、そのテーブルは可視であると言います。つまり、これは、テーブルが明示的なスキーマ修飾なしで名前によって参照可能であるということです。例えば、次のようにして、全ての可視テーブルの名前を列挙可能です。

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

表 9-41. スキーマ可視性照会関数

名前戻り値型説明
pg_table_is_visible(table_oid) booleanテーブルが検索パスにおいて可視であるか
pg_type_is_visible(type_oid) booleanデータ型(またはドメイン)が検索パスにおいて可視であるか
pg_function_is_visible(function_oid) boolean関数が検索パスにおいて可視であるか
pg_operator_is_visible(operator_oid) boolean演算子が検索パスにおいて可視であるか
pg_opclass_is_visible(opclass_oid) boolean演算子クラスが検索パスにおいて可視であるか
pg_conversion_is_visible(conversion_oid) boolean変換が検索パスにおいて可視であるか

pg_table_is_visible関数により、テーブル(もしくはビュー、あるいは他のpg_classエントリの種類全て)に対する検査を行います。pg_type_is_visiblepg_function_is_visiblepg_operator_is_visiblepg_opclass_is_visibleおよびpg_conversion_is_visible関数により、それぞれデータ型(およびドメイン)、関数、演算子、演算子クラス、および変換に対する同様の可視性検査を行います。関数および演算子の場合、検索パスのそれ以前の箇所に、同じ名前および引数データ型のオブジェクトがなければ、そのパス内でオブジェクトは可視です。演算子クラスの場合、名前および関連付けられているインデックスアクセスメソッドの両方が考慮されます。

これらの関数は全て、検査するオブジェクトを識別するために、オブジェクトのOIDを必要とします。オブジェクトを名前でテストする場合、OID別名型(regclassregtyperegprocedure、またはregoperator)を使用すると便利です。例えば、以下のようにします。

SELECT pg_type_is_visible('myschema.widget'::regtype);

ただし、このように修飾されていない名前をテストしても、あまり意味がないことに注意してください。名前が認識されれば、それは必ず可視ということになります。

表9-42に、システムカタログから情報を抽出する関数を列挙します。

表 9-42. システムカタログ情報関数

名前戻り値型説明
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)textserialもしくはbigserial列が使用するシーケンス名の取得
pg_tablespace_databases(tablespace_oid)setof oidテーブル空間内にオブジェクトを所有するデータベースのOID集合を取得
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コマンドを取得

format_typeは、自身の型OIDとひょっとしたら型修飾子によって特定されるデータ型のSQL名を返します。特定の修飾子が既知でなければ型修飾子にNULLを渡します。

pg_get_constraintdefpg_get_indexdefpg_get_ruledef、 および pg_get_triggerdef、それぞれ対応する制約、インデックス、ルール、もしくはトリガに対するコマンド作成を再構築します。(これはコマンドのオリジナルテキストではなく、逆コンパイルされた再構築であることに注意してください。)pg_get_exprは、列のデフォルト値のような個々の式の内部形式を逆コンパイルします。システムカタログの内容を試験するときに便利です。 pg_get_viewdef はビューを定義するSELECT問い合わせを再構築します。これらの関数のほとんどは2つの異形があり、そのうちの1つはオプションとして結果を"pretty print"(訳注:"見やすく表示")します。pretty printされた書式はより読みやすい半面、デフォルトの書式の方が今後のバージョンのPostgreSQLでも同様に解釈することができそうです。ダンプを目的とする場合は、見やすく表示する出力を使用しないでください。見やすい表示用のパラメータにfalseを渡すことで、このパラメータをまったく持たない種類の結果と同一の結果を生成します。

pg_get_serial_sequenceserialもしくはbigserial列と結び付いたシーケンス名をフェッチします。名前はシーケンス関数を渡すために適切にフォーマットされます(項9.12を参照)。列に結び付いたシーケンスが無い場合、NULLが返されます。

pg_tablespace_databasesによりテーブル空間の使用状況を確認することができます。これは、そのテーブル空間内に格納されたオブジェクトを持つデータベースのOIDの集合を返します。この関数が何らかの行を返した場合、このテーブル空間は空ではなく、そのため、削除することができませんテーブル空間内に格納された特定のオブジェクトを表示するためには、pg_tablespace_databasesで識別されたデータベースに接続し、そのpg_classカタログに問い合わせを行う必要があります。

pg_get_userbyidはOIDで与えられたロール名を取り出します。

表9-43に示される関数は、COMMENTコマンドによって以前に保存されたコメントを抽出します。指定されたパラメータに一致するコメントが検出されない場合、NULL値が返されます。

表 9-43. コメント情報関数

名前戻り値型説明
obj_description(object_oid, catalog_name)textデータベースオブジェクトのコメントを取得
obj_description(object_oid)textデータベースオブジェクトのコメントを取得(廃止予定
col_description(table_oid, column_number)textテーブルの列のコメントを取得

obj_description()関数の2つのパラメータを取る形式はそのOIDと保有しているシステムカタログの名前で指定されたデータベースオブジェクトのコメントを返します。例えば、obj_description(123456,'pg_class')はOID 123456を持つテーブルのコメントを抽出します。obj_description()関数の単一パラメータ形式はオブジェクトのOIDのみ必要とします。異なったシステムカタログに渡ってOIDが一意である保証はないことから現在は使われません。ですから、間違ったコメントが返ることがあります。

col_description()関数は、テーブルのOIDとその列番号で指定されるテーブルの列のコメントを返します。obj_description()関数は、テーブル列自体がOIDを所有していませんので、テーブル列に対して使用することはできません。