他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 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.25. システム情報関数

表 9.60に、セッションおよびシステムの情報を抽出する関数を示します。

本節で列挙されている関数のほかに、同様にシステム情報を提供する統計システムに関連した数多くの関数があります。 28.2.2にさらに情報があります。

表9.60 セッション情報関数

名前戻り型説明
current_catalogname現在のデータベースの名前(SQL標準ではカタログと呼ばれる)
current_database()name現在のデータベースの名前
current_query()textクライアントから提示された、現在実行中問い合わせのテキスト(複数の文を含むことあり)
current_rolenamecurrent_userと同等
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ローカル接続のポート
pg_backend_pid()int 現在のセッションに結びついたサーバプロセスのプロセスID
pg_blocking_pids(int)int[]指定のサーバプロセスIDによるロック取得をブロックしているプロセスID
pg_conf_load_time()timestamp with time zone設定を読み込んだ時刻
pg_current_logfile([text])textログ収集機構が現在使用しているプライマリ、または指定のフォーマットのログのログファイルの名前
pg_my_temp_schema()oidセッションの一時スキーマのOID、なければ0
pg_is_other_temp_schema(oid)booleanスキーマが他のセッションの一時スキーマかどうか?
pg_listening_channels()setof text今のセッションにおいて現在待ち受け中のチャンネル名
pg_notification_queue_usage()double非同期通知キューのうち、現在占められている割合(0から1まで)
pg_postmaster_start_time()timestamp with time zoneサーバの起動時刻
pg_safe_snapshot_blocking_pids(int)int[]指定のサーバプロセスIDによる安全なスナップショットの取得をブロックしているプロセスID
pg_trigger_depth()intPostgreSQLのトリガの現在の入れ子の深さ (直接的であれ間接的であれ、トリガ内部から呼ばれていなければ0を返す)
session_usernameセッションのユーザ名
usernamecurrent_userと等価
version()textPostgreSQLバージョン情報。機械読み取り可能なバージョンについてはserver_version_numを参照。

注記

current_catalogcurrent_rolecurrent_schemacurrent_usersession_userおよびuserSQLにおいて特殊な構文上の地位を持っており、最後に括弧を付けずに呼び出さなければなりません。 (PostgreSQLではcurrent_schemaの場合括弧を使用することができますが、他は使えません。)

session_userは、通常、現在のデータベース接続を開始したユーザです。しかし、スーパーユーザはこの設定をSET SESSION AUTHORIZATIONを使用して変更することができます。 current_userは、権限の検査に適用されるユーザ識別子です。 通常はセッションユーザと同じですが、SET ROLEを使用して変更可能です。 SECURITY DEFINER属性を持つ関数の実行中にも変わります。 Unix用語で言うと、セッションユーザは実ユーザで、現在のユーザは実効ユーザです。 current_roleusercurrent_userの同義語です。 (標準SQLではcurrent_rolecurrent_userを区別していますが、PostgreSQLではユーザとロールを1種類のエンティティに統合しているため、両者に区別はありません。)

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はそのポート番号を返します。 これら全ての関数は接続がUnixドメインソケット経由の場合NULLを返します。

pg_blocking_pidsは指定のプロセスIDのサーバプロセスをブロックしているセッションのプロセスIDの配列を返します。 指定のサーバプロセスが存在しない、あるいはそれがブロックされていないときは空の配列を返します。 あるサーバプロセスが別のサーバプロセスをブロックするのは、ブロックされるプロセスのロック要求と競合するロックを保持している場合(ハードブロック)、あるいは、ブロックされるプロセスのロック要求と競合するロックを待っていて、かつロック待ちキュー内でより前方にいる場合(ソフトロック)です。 パラレルクエリーを使っている場合、実際のロックを子ワーカプロセスが保持または待っている場合であっても、この結果には必ずクライアントから可視のプロセスID(つまり、pg_backend_pidの結果)が示されます。 そのような仕様なので、この結果には重複するPIDが含まれることもあります。 また、プリペアドのトランザクションが競合するロックを保持している場合、この関数の結果ではプロセスIDがゼロとして示されることにも注意して下さい。 この関数はロックマネージャの共有状態に短時間、排他的アクセスをする必要があるため、それを頻繁に呼び出すとデータベースのパフォーマンスに多少、影響するかもしれません。

pg_conf_load_timeはサーバの設定ファイルが最後に読み込まれた時のtimestamp with time zoneを返します。 (現在のセッションがそのときに活動中だった場合、これはそのセッション自身が設定ファイルを再読み込みした時刻になるため、その結果はセッションによって少し異なるかもしれません。 それ以外の場合は、postmasterプロセスが設定ファイルを再読み込みした時刻になります。)

pg_current_logfileはログ収集機構が現在使用しているログファイルのパスをtext,として返します。 パスにはlog_directoryディレクトリとログファイルの名前が含まれます。 ログ収集が有効になっていなければならず、そうでなければ戻り値はNULLになります。 複数のログファイルがそれぞれ異なる形式で存在する場合、引数なしのpg_current_logfileは、順序リスト(stderrcsvlog)の最初に出てくる形式のファイルのパスを返します。 これらの形式のログファイルがないときはNULLが返されます。 特定のファイル形式を要求するには、オプションパラメータの値としてcsvlogまたはstderrtextとして渡してください。 指定のログ形式がlog_destinationで設定されていない場合は、戻り値がNULLとなります。 pg_current_logfilescurrent_logfilesファイルの内容を反映します。

pg_my_temp_schemaは、現在のセッションの一時スキーマのOIDを返します。(一時テーブルをまだ1つも作成しておらず)存在しなければゼロを返します。 pg_is_other_temp_schemaは、指定したOIDが他のセッションの一時スキーマのOIDであれば、真を返します。 (例えば、他のセッションの一時テーブルをカタログ表示から除外したい場合などで有用です。)

pg_listening_channelsは現在のセッションが監視している非同期通知チャネルの名前の集合を返します。 pg_notification_queue_usageは通知用に利用可能な全領域のうち、処理待ちになっている通知によって現在占められている割合を0から1の範囲のdoubleとして返します。 詳しくはLISTENおよびNOTIFYを参照して下さい。

pg_postmaster_start_timeは、サーバが起動したときのtimestamp with time zoneを返します。

pg_safe_snapshot_blocking_pidsは、指定のプロセスIDが安全なスナップショットを取得するのをブロックしているサーバプロセスのセッションのプロセスIDの配列を返します。 そのようなサーバプロセスが存在しない場合、またはブロックされていない場合は空の配列が返されます。 SERIALIZABLEトランザクションを実行しているセッションは、SERIALIZABLE READ ONLY DEFERRABLEトランザクションが述語ロックの取得をすべて回避しても安全であると決定するまで、後者がスナップショットを取得するのをブロックします。 シリアライザブルトランザクションおよび遅延可能トランザクションについてのさらなる情報については13.2.3を参照してください。 この関数を頻繁に呼び出すと、短時間に述語ロックマネージャの共有状態にアクセスする必要があるため、データベースのパフォーマンスに若干の影響が出るかもしれません。

version関数はPostgreSQLサーバのバージョンを記述した文字列を返します。 この情報はserver_versionでも取得できますし、機械読み取り可能なバージョンはserver_version_numで取得できます。 ソフトウェア開発者はテキスト版の結果を解析するのではなく、server_version_num(バージョン8.2以降で利用可能)あるいは PQserverVersion を利用すべきです。

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

表9.61 アクセス権限照会関数

名前戻り型説明
has_any_column_privilege(user, table, privilege) booleanユーザがテーブルのどれか1つの列に対して権限を所有しているか
has_any_column_privilege(table, privilege) boolean現在のユーザがテーブルのどれか1つの列に対して権限を所有しているか
has_column_privilege(user, table, column, privilege) booleanユーザに列に対する権限があるか
has_column_privilege(table, column, privilege) boolean現在のユーザに列に対する権限があるか
has_database_privilege(user, database, privilege) booleanユーザにデータベースに対する権限があるのか
has_database_privilege(database, privilege) boolean現在のユーザにデータベースに対する権限があるのか
has_foreign_data_wrapper_privilege(user, fdw, privilege) booleanユーザに外部データラッパに対する権限があるのか
has_foreign_data_wrapper_privilege(fdw, 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_sequence_privilege(user, sequence, privilege) booleanユーザにシーケンスに対する権限があるのか
has_sequence_privilege(sequence, privilege) boolean現在のユーザにシーケンスに対する権限があるのか
has_server_privilege(user, server, privilege) booleanユーザに外部サーバに対する権限があるのか
has_server_privilege(server, 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現在のユーザにテーブル空間に対する権限があるのか
has_type_privilege(user, type, privilege) booleanユーザに型に対する権限があるのか
has_type_privilege(type, privilege) boolean現在のユーザに型に対する権限があるのか
pg_has_role(user, role, privilege) booleanユーザにロールに対する権限があるのか
pg_has_role(role, privilege) boolean現在のユーザにロールに対する権限があるのか
row_security_active(table) boolean現在のユーザに有効なテーブルの行単位セキュリティがあるのか

has_table_privilegeはユーザが特定の方法でテーブルにアクセス可能かどうかを検査します。 ユーザは名前、OID(pg_authid.oid)、もしくは擬似的なPUBLICロールを意味するpublicで指定できます。省略された場合はcurrent_userが使われます。 テーブルは名前もしくはOIDで指定可能です。 (従って、実際にはhas_table_privilegeの6つの変形があり、引数の数と型で区別されます。) 名前を指定する場合、必要であればスキーマ修飾できます。 対象とするアクセス権限の種類はテキスト文字列で指定され、それは、SELECTINSERTUPDATEDELETETRUNCATEREFERENCES、またはTRIGGERのどれかである必要があります。 オプションとして、権限がGRANTオプションにより付与されているかどうかの権限の検査するため、WITH GRANT OPTIONを付加することができます。 更に、複数の権限の種類をコンマで区切って列挙可能です。この場合、結果は列挙された権限の1つでも存在すればとなります。 (権限文字列の大文字小文字は重要ではありません。余分な空白は権限名と権限名の間にはあっても良いですが、権限名の途中にはあってはいけません。) 例を示します。

SELECT has_table_privilege('myschema.mytable', 'select');
SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');

has_sequence_privilegeはユーザが特定の方法でシーケンスにアクセス可能かどうかを検査します。 取り得る引数はhas_table_privilegeに対するものと類似しています。 対象とする権限の種類はUSAGESELECTまたはUPDATEのいずれかである必要があります。

has_any_column_privilegeはユーザが特定の方法でテーブルのどれか1つの列にアクセス可能かどうかを検査します。 取り得る引数はhas_table_privilegeに対するものと類似していますが、対象とする権限の種類がSELECTINSERTUPDATE、またはREFERENCESの組み合わせである必要がある点を除きます。 テーブル単位でこれらの権限を所有することは、テーブルのそれぞれの列に対し暗黙的にそれらの権限を与えることになるため、has_table_privilegeを返す場合は、同一の引数に対してhas_any_column_privilegeは常にを返すということに注意して下さい。 しかし、少なくとも一つの列に対し権限の列単位の許可がある場合にもhas_any_column_privilegeは成功します。

has_column_privilegeはユーザが特定の方法でテーブルのある列にもアクセス可能かどうかを検査します。 取り得る引数はhas_table_privilegeと類似していますが、名前または属性番号のいずれかで列の指定が追加されます。 対象とするアクセス権限の種類はSELECTINSERTUPDATE、またはREFERENCESの組み合わせでなければなりません。 テーブル単位のこれらの権限を所有することは、テーブルのそれぞれの列に対し暗黙的にそれら権限を与えることに注意してください。

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

has_function_privilege関数は、ユーザが特定の方法で関数にアクセス可能かどうかを検査します。 取り得る引数はhas_table_privilegeと同じです。 関数をOIDではなくテキスト文字列で指定する場合、regprocedure データ型(8.18を参照)と同じ入力が可能です。 対象とするアクセス権限の種類はEXECUTEである必要があります。 以下に例を示します。

SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');

has_foreign_data_wrapper_privilege関数は、ユーザが特定の方法で外部データラッパーにアクセス可能かどうかを検査します。 取り得る引数はhas_table_privilegeと同じです。 対象とするアクセス権限の種類はUSAGEである必要があります。

has_language_privilege関数は、ユーザが特定の方法で手続き言語にアクセス可能かどうかを検査します。 取り得る引数は、has_table_privilegeに類似しています。 対象とするアクセス権限の種類はUSAGEである必要があります。

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

has_server_privilegeはユーザが特定の方法で外部サーバにアクセスできるかどうかを検査します。 取り得る引数はhas_table_privilegeに類似しています。 対象とするアクセス権限の種類はUSAGEである必要があります。

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

has_type_privilegeは、ユーザが型に特定の方法でアクセス可能かどうかを検査します。 取り得る引数はhas_table_privilegeに類似しています。 型をOIDではなくテキスト文字列で指定する場合、可能な入力はregtypeデータ型に対するものと同じです(8.18参照)。 対象とするアクセス権限の種類はUSAGEである必要があります。

pg_has_roleは、ユーザが特定の方法でロールにアクセスできるかどうかを検査します。 取り得る引数については、publicがユーザ名として使用不可であることを除き、has_table_privilegeと類似しています。 対象とするアクセス権限の種類は、 MEMBERUSAGEの組み合わせである必要があります。 MEMBERは、ロールの直接または間接メンバ資格(つまり、SET ROLEを行う権限)を表します。一方、USAGEは、そのロール権限がSET ROLEをしなくてもすぐに利用できることを表します。

row_security_activecurrent_userと現在の環境において、指定のテーブルで行単位セキュリティが有効かどうかを検査します。 テーブルは名前またはOIDで指定できます。

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

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

表9.62 スキーマ可視性照会関数

名前戻り型説明
pg_collation_is_visible(collation_oid) boolean照合順序が検索パスにおいて可視かどうか
pg_conversion_is_visible(conversion_oid) boolean変換が検索パスにおいて可視かどうか
pg_function_is_visible(function_oid) boolean関数が検索パスにおいて可視であるか
pg_opclass_is_visible(opclass_oid) boolean演算子クラスが検索パスにおいて可視であるか
pg_operator_is_visible(operator_oid) boolean演算子が検索パスにおいて可視であるか
pg_opfamily_is_visible(opclass_oid) boolean演算子族が検索パスにおいて可視であるか
pg_statistics_obj_is_visible(stat_oid) boolean統計情報オブジェクトが検索パスにおいて可視であるか
pg_table_is_visible(table_oid) booleanテーブルが検索パスにおいて可視かどうか
pg_ts_config_is_visible(config_oid) booleanテキスト検索設定が検索パスにおいて可視かどうか
pg_ts_dict_is_visible(dict_oid) booleanテキスト検索辞書が検索パスにおいて可視かどうか
pg_ts_parser_is_visible(parser_oid) booleanテキスト検索パーサが検索パスにおいて可視かどうか
pg_ts_template_is_visible(template_oid) booleanテキスト検索テンプレートが検索パスにおいて可視かどうか
pg_type_is_visible(type_oid) boolean型(またはドメイン)が検索パスにおいて可視かどうか

それぞれの関数はデータベースオブジェクトの1つの型に対して可視性の検査を行います。 pg_table_is_visibleがビュー、マテリアライズドビュー、インデックス、シーケンス、外部テーブルに対しても使用できること、pg_type_is_visibleがドメインに対しても使用できることに注意してください。 関数および演算子では、パスの前方に同じ名前かつ同じ引数のデータ型を持つオブジェクトが存在しなければ、検索パス内のオブジェクトは可視です。 演算子クラスでは、名前と関連するインデックスアクセスメソッドが考慮されます。

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

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

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

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

表9.63 システムカタログ情報関数

名前戻り型説明
format_type(type_oid, typemod)textデータ型のSQL名を取得
pg_get_constraintdef(constraint_oid)text制約の定義を取得
pg_get_constraintdef(constraint_oid, pretty_bool)text制約の定義を取得
pg_get_expr(pg_node_tree, relation_oid)text式中のすべてのVarが2番目のパラメータによって指定されるリレーションを参照すると仮定して、式の内部形式を逆コンパイル
pg_get_expr(pg_node_tree, relation_oid, pretty_bool)text式中のすべてのVarが2番目のパラメータによって指定されるリレーションを参照すると仮定して、式の内部形式を逆コンパイル
pg_get_functiondef(func_oid)text関数定義の取得
pg_get_function_arguments(func_oid)text関数定義の引数リスト(デフォルト値付き)を取得
pg_get_function_identity_arguments(func_oid)text関数を特定するための引数リスト(デフォルト値なし)を取得
pg_get_function_result(func_oid)text関数に対するRETURNS句の取得
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_keywords()setof recordSQLキーワードとそれらの種類のリストを取得
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、またはIDENTITY列が使用するシーケンス名を取得
pg_get_statisticsobjdef(statobj_oid)text拡張統計情報オブジェクトのCREATE STATISTICSコマンドを取得
pg_get_triggerdef(trigger_oid)textトリガに対するCREATE [ CONSTRAINT ] TRIGGERコマンドの取得
pg_get_triggerdef(trigger_oid, pretty_bool)textトリガに対するCREATE [ CONSTRAINT ] TRIGGERコマンドの取得
pg_get_userbyid(role_oid)name与えられたOIDでロール名を取得
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_get_viewdef(view_oid, wrap_column_int)textビューまたはマテリアライズドビューの元になるSELECTコマンドを取得。 フィールドを含む行は指定された列数で折り返され、成形された表示が行われます。
pg_index_column_has_property(index_oid, column_no, prop_name)booleanインデックス列が指定の属性を持っているかどうか検査する
pg_index_has_property(index_oid, prop_name)booleanインデックスが指定の属性を持っているかどうか検査する
pg_indexam_has_property(am_oid, prop_name)booleanインデックスアクセスメソッドが指定の属性を持っているかどうか検査する
pg_options_to_table(reloptions)setof record格納オプションの名前/値のペアのセットを取得
pg_tablespace_databases(tablespace_oid)setof oidテーブル空間内にオブジェクトを所有するデータベースOID集合を取得
pg_tablespace_location(tablespace_oid)text指定したテーブル空間が実際に配置されているファイルシステム上のパスを取得
pg_typeof(any)regtype指定した値のデータ型を取得
collation for (any)text引数の照合順序を取得
to_regclass(rel_name)regclass指定のリレーションのOIDを取得
to_regproc(func_name)regproc指定の関数のOIDを取得
to_regprocedure(func_name)regprocedure指定の関数のOIDを取得
to_regoper(operator_name)regoper指定の演算子のOIDを取得
to_regoperator(operator_name)regoperator指定の演算子のOIDを取得
to_regtype(type_name)regtype指定の型のOIDを取得
to_regnamespace(schema_name)regnamespace指定のスキーマのOIDを取得
to_regrole(role_name)regrole指定のロールのOIDを取得

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

関数pg_get_keywordsは、サーバが認識したSQLキーワードを記述するレコードの集合を返します。 word列にはキーワードが含まれます。 catcode列は種類コードで、Uは未予約(unreserved)、Cは列名(column)、Tは型名(type)または関数名、Rは予約語(reserved)です。 catdesc列は種類を記述する文字列を含み、現地語化されている場合もあります。

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

pg_get_functiondefは、関数の完全なCREATE OR REPLACE FUNCTION文を返します。 pg_get_function_argumentsは、CREATE FUNCTIONの中に出現しなければならない形式で、引数リストを返します。 pg_get_function_resultは同様、その関数の適切なRETURNS句を返します。 pg_get_function_identity_argumentsは、例えばALTER FUNCTIONの中に出現しなければならない形式で、関数を特定するのに必要な引数リストを返します。 この形式はデフォルト値を省略します。

pg_get_serial_sequenceは、列に関連するシーケンスの名前を返します。 列に関連するシーケンスが存在しなければ、NULLを返します。 列がIDENTITY列の場合、関連するシーケンスはIDENTITY列に対して内部的に作成されたシーケンスとなります。 SERIAL型(serialsmallserialbigserial)の一つを使って作られた列については、そのSERIAL列の定義に対して作られたシーケンスとなります。 後者の場合、この関連付けはALTER SEQUENCE OWNED BYで修正または削除することができます。 (この関数はおそらくpg_get_owned_sequenceと呼ばれるべきだったのでしょうが、現在の名前はそれが主にserial列またはbigserial列と一緒に使われていたという事実によります。) 最初の入力パラメータはテーブル名で、スキーマを付けることもできます。 2番目のパラメータは列名です。 最初のパラメータは普通はスキーマとテーブルですので、二重引用符付の識別子としては解釈されません。 つまり、デフォルトで小文字に変換されます。 一方2番目のパラメータは単なる列名であり、二重引用符付として解釈され、その大文字小文字は保持されます。 この関数は、シーケンス関数(9.16を参照)に渡すことができるよう適切な書式で値を返します。 典型的な使用法はIDENITY列またはSERIAL列のシーケンスの現在値を読み取ることで、例えば

SELECT currval(pg_get_serial_sequence('sometable', 'id'));

pg_get_userbyidはそのOIDで与えられたロールの名前を抽出します。

pg_index_column_has_propertypg_index_has_propertypg_indexam_has_propertyは指定のインデックス列、インデックス、あるいはインデックスアクセスメソッドが、指定の属性を所有しているかどうかを返します。 属性名が不明の場合、属性がその特定のオブジェクトに当てはまらない場合、OIDや列番号が有効なオブジェクトを特定できない場合はNULLが返されます。 列の属性については表 9.64、インデックスの属性については表 9.65、アクセスメソッドの属性については表 9.66を参照して下さい。 (拡張のアクセスメソッドはそのインデックスについて追加の属性名を定義できることに注意して下さい。)

表9.64 インデックス列の属性

名前説明
asc前方スキャンで列は昇順にソートされるか
desc前方スキャンで列は降順にソートされるか
nulls_first前方スキャンで列はNULLを先頭にしてソートするか
nulls_last前方スキャンで列はNULLを最後にしてソートするか
orderable列は定義済みのソート順を所有しているか
distance_orderable列は距離の演算子の順序に従ってスキャンできるか、例えばORDER BY col <-> 定数など
returnable列の値をインデックスオンリースキャンで返すことができるか
search_array列はcol = ANY(array)の検索をネイティブにサポートしているか
search_nulls列はIS NULLおよびIS NOT NULLの検索をサポートしているか

表9.65 インデックスの属性

名前説明
clusterableインデックスをCLUSTERコマンドで使うことができるか
index_scanインデックスは通常の(ビットマップでない)スキャンをサポートしているか
bitmap_scanインデックスはビットマップスキャンをサポートしているか
backward_scanスキャンの途中でスキャン方向を変更できるか(マテリアライゼーションを必要とせずにカーソルの FETCH BACKWARDをサポートするため)

表9.66 インデックスアクセスメソッドの属性

名前説明
can_orderアクセスメソッドはCREATE INDEXにおいてASCDESCおよび関連するキーワードをサポートしているか
can_uniqueアクセスメソッドは一意インデックスをサポートしているか
can_multi_colアクセスメソッドは複数列にまたがるインデックスをサポートしているか
can_excludeアクセスメソッドは除外制約をサポートしているか

pg_options_to_tableは、pg_class.reloptionsまたはpg_attribute.attoptionsが渡されたときに、格納オプションの名前と値のペア(option_name/option_value)の集合を返します。

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

pg_typeofは、渡される値のデータ型のOIDを返します。 これはトラブル解決作業、または動的にSQL問い合わせを生成するのに便利です。 この関数は、OID型の別名であるregtypeを返すものとして宣言されます(8.18を参照)。つまり、比較が目的ならOIDと同一ですが、型名として表示されます。 以下に例をあげます。

SELECT pg_typeof(33);

 pg_typeof 
-----------
 integer
(1 row)

SELECT typlen FROM pg_type WHERE oid = pg_typeof(33);
 typlen 
--------
      4
(1 row)

collation for式は、それに渡された値の照合順序を返します。 例を示します。

SELECT collation for (description) FROM pg_description LIMIT 1;
 pg_collation_for 
------------------
 "default"
(1 row)

SELECT collation for ('foo' COLLATE "de_DE");
 pg_collation_for 
------------------
 "de_DE"
(1 row)

値には引用符が付けられ、またはスキーマ修飾されることがあります。 もし引数の式から何も照合順序が得られなかった場合、NULLが返されます。 もし引数が照合順序をサポートしないデータ型だった場合、エラーとなります。

to_regclassto_regprocto_regprocedureto_regoperto_regoperatorto_regtypeto_regnamespaceto_regrole関数はリレーション、関数、演算子、型、スキーマ、ロールの名前(textとして渡されます)をそれぞれregclassregprocregprocedureregoperregoperatorregtyperegnamespaceregrole型のオブジェクトに変換します。 数値OIDを受け付けず、名前が見つからない(もしくは、to_regprocto_regoperでは、与えられた名前が複数のオブジェクトに一致する)場合にはエラーを発生するのではなくnullを返すという点で、これらの関数はテキストからのキャストとは異なります。

表 9.67にデータベースオブジェクトの識別とアドレスに関連する関数を示します。

表9.67 オブジェクト情報とアドレスの関数

名前戻り型説明
pg_describe_object(catalog_id, object_id, object_sub_id)textデータベースオブジェクトの説明の取得
pg_identify_object(catalog_id oid, object_id oid, object_sub_id integer)type text, schema text, name text, identity textデータベースオブジェクトの識別の取得
pg_identify_object_as_address(catalog_id oid, object_id oid, object_sub_id integer)type text, name text[], args text[]データベースオブジェクトのアドレスの外部表現を取得
pg_get_object_address(type text, name text[], args text[])catalog_id oid, object_id oid, object_sub_id int32データベースオブジェクトのアドレスの外部表現から、アドレスを取得

pg_describe_objectはカタログOID、オブジェクトOID、もしくはサブオブジェクトOID(0のこともある)で指定されたデータベースオブジェクトのテキストによる説明を返します。 この説明はサーバの設定に依存しますが、人が読んでわかる、そして翻訳も可能になることを目的としたのもです。 これはpg_dependカタログに格納されたオブジェクトの識別判断の際に有用です。

pg_identify_objectはカタログOID、オブジェクトOID、そしてサブオブジェクトID(0のこともある)により指定されるデータベースオブジェクトを一意に特定するために十分な情報を含む行を返します。 この情報は機械による読み取りを目的としており、決して翻訳されません。 typeはデータベースオブジェクトの型を識別するものです。 schemaはオブジェクトが所属するスキーマの名前ですが、スキーマに所属しないオブジェクト型の場合はNULLになります。 nameは(必要なら引用符で括った)オブジェクトの名前ですが、(適切ならスキーマ名と合わせて)オブジェクトの一意識別子として使用できる場合にのみ指定し、それ以外の場合はNULLにします。 identityは完全なオブジェクトの識別で、オブジェクトの型に依存した正確なフォーマットを持っています。 フォーマット内の各部分はスキーマ修飾されており、必要に応じて引用符で括られます。

pg_identify_object_as_addressはカタログOID、オブジェクトOID、そしてサブオブジェクトID(0のこともある)により指定されるデータベースオブジェクトを一意に特定するために充分な情報を含む行を返します。 返される情報は現在のサーバに依存しません。 つまり、他のサーバで全く同じ名前を付けられたオブジェクトを識別するために使うことができます。 typeはデータベースオブジェクトの型を識別するものです。 nameargsは文字列の配列で、それらが組み合わされてオブジェクトへの参照を構成します。 これらの3つの列は、オブジェクトの内部アドレスを取得するためにpg_get_object_addressに渡すことができます。 この関数はpg_get_object_addressの逆関数です。

pg_get_object_addressは、型、オブジェクト名および引数の配列で指定されたデータベースオブジェクトを一意に特定するために十分な情報を含む行を返します。 返される値は、pg_dependなどのシステムカタログで使用されるもので、pg_identify_objectpg_describe_objectなど他のシステム関数に渡すことができます。 catalog_idはオブジェクトを含むシステムカタログのOIDです。 object_idはオブジェクト自体のOIDです。 object_sub_idはオブジェクトのサブID、なければ0です。 この関数はpg_identify_object_as_addressの逆関数です。

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

表9.68 コメント情報関数

名前戻り型説明
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と同じように使用されます。 一部のシステムカタログは、各クラスタ内のデータベース全体に対して大域的です。これらのコメントも同様に大域的に格納されます。

表 9.69で示される関数はサーバトランザクション情報をエクスポートできる形式で提供します。 これら関数の主な使用目的は2つのスナップショット間でどちらのトランザクションがコミットされたのかを特定するためです。

表9.69 トランザクションIDとスナップショット

名前戻り型説明
txid_current()bigint現在のトランザクションIDの取得、現在のトランザクションにIDがなければ新規に割り当てる
txid_current_if_assigned()biginttxid_current()と同じだが、まだトランザクションIDが割り当てられていなければ、新規に割り当てずにNULLを返す
txid_current_snapshot()txid_snapshot現在のスナップショットの取得
txid_snapshot_xip(txid_snapshot)setof bigintスナップショットにある進行中のトランザクションIDの取得
txid_snapshot_xmax(txid_snapshot)bigintスナップショットのxmaxの取得
txid_snapshot_xmin(txid_snapshot)bigintスナップショットのxminの取得
txid_visible_in_snapshot(bigint, txid_snapshot)booleanスナップショットにあるトランザクションIDは可視か?(サブトランザクションIDで使用しないこと)
txid_status(bigint)txid_status指定のトランザクションのステータス(committedabortedin progress、NULL(トランザクションIDが古すぎる場合))を報告する

内部トランザクションID型(xid)は32ビット幅なので40億トランザクション毎にラップします。 とは言っても、これらの関数はepochカウンタにより拡張された64ビット形式をエクスポートするため、インストレーションの生涯にわたってラップしないでしょう。 これらの関数で使用されるデータ型、txid_snapshotはある特定の時間におけるトランザクションIDの可視性に関する情報を格納します。 構成要素は表 9.70に記載されています。

表9.70 スナップショット構成要素

名前説明
xmin現在実行中で最も早いトランザクションID(txid)。 これより早い全てのトランザクションはコミットされて可視となっているか、またはロールバックされて消滅している。
xmaxまだ割り当てられていない最初のtxid。 これと等しいかより大きい全てのtxidはスナップショットの時点で未開始であり、従って不可視。
xip_listスナップショット時の実行中のtxid。 リストはxminxmax間の実行中のtxidのみを含む。 xmaxより高位で実行中のtxidが存在することもある。 xmin <= txid < xmaxであり、このリストにないtxidはスナップショット時に既に完了しており、従って、コミット状態によって、可視か消滅かのいずれか。 リストには副トランザクションのtxidは含まれない。

txid_snapshotのテキスト表現はxmin:xmax:xip_listです。 例えば、10:20:10,14,15xmin=10, xmax=20, xip_list=10, 14, 15を意味します。

txid_status(bigint)は最近のトランザクションのコミット状態について報告します。 COMMITの進行中にアプリケーションとデータベースが切断されたときに、アプリケーションはトランザクションがコミットされたか中断されたかを知るためにこれを使うことができます。 トランザクションが最近のもので、システムがそのトランザクションのコミット状態を保持している場合は、トランザクションの状態はin progresscommittedあるいはabortedとして報告されます。 トランザクションが古く、その参照がシステムに残っておらず、コミット状態の情報が破棄されている場合は、この関数はNULLを返します。 プリペアドのトランザクションはin progressとして報告されること、そして指定のtxidがプリペアドのトランザクションかどうかを確認する必要がある場合は、アプリケーションはpg_prepared_xactsを調べなければならないことに注意してください。

表 9.71に示す関数は、コミット済みのトランザクションに関する情報を提供します。 これらの関数は主に、トランザクションがいつコミットされたかについての情報を提供します。 これらは、設定オプションtrack_commit_timestampが有効な時にのみ、しかもそれが有効にされた後にコミットされたトランザクションについてのみ有意なデータを提供します。

表9.71 コミットされたトランザクションの情報

名前戻り型説明
pg_xact_commit_timestamp(xid) timestamp with time zoneトランザクションのコミットのタイムスタンプを取得
pg_last_committed_xact() xid xid, timestamp timestamp with time zone最後にコミットされたトランザクションのトランザクションIDとコミットのタイムスタンプを取得

表 9.72に示す関数は、カタログのバージョンなどといったinitdbの実行時に初期化される情報を表示します。 それらはまた、先行書き込みログとチェックポイント処理についての情報も示します。 この情報はクラスタ全体に渡るもので、どれか1つのデータベースに特有のものではありません。 それらはpg_controldataと同じ情報源から、ほぼ同じ情報を提供しますが、SQL関数により適した形式になります。

表9.72 制御データ関数

名前戻り値型説明
pg_control_checkpoint() record現在のチェックポイントの状態に関する情報を返す
pg_control_system() record現在の制御ファイルの状態に関する情報を返す
pg_control_init() recordクラスタの初期化状態に関する情報を返す
pg_control_recovery() recordリカバリの状態に関する情報を返す

pg_control_checkpoint表 9.73に示すレコードを返します。

表9.73 pg_control_checkpointの列

列名データ型
checkpoint_lsnpg_lsn
prior_lsnpg_lsn
redo_lsnpg_lsn
redo_wal_filetext
timeline_idinteger
prev_timeline_idinteger
full_page_writesboolean
next_xidtext
next_oidoid
next_multixact_idxid
next_multi_offsetxid
oldest_xidxid
oldest_xid_dbidoid
oldest_active_xidxid
oldest_multi_xidxid
oldest_multi_dbidoid
oldest_commit_ts_xidxid
newest_commit_ts_xidxid
checkpoint_timetimestamp with time zone

pg_control_system表 9.74に示すレコードを返します。

表9.74 pg_control_systemの列

列名データ型
pg_control_versioninteger
catalog_version_nointeger
system_identifierbigint
pg_control_last_modifiedtimestamp with time zone

pg_control_init表 9.75に示すレコードを返します。

表9.75 pg_control_initの列

列名データ型
max_data_alignmentinteger
database_block_sizeinteger
blocks_per_segmentinteger
wal_block_sizeinteger
bytes_per_wal_segmentinteger
max_identifier_lengthinteger
max_index_columnsinteger
max_toast_chunk_sizeinteger
large_object_chunk_sizeinteger
float4_pass_by_valueboolean
float8_pass_by_valueboolean
data_page_checksum_versioninteger

pg_control_recovery表 9.76に示すレコードを返します。

表9.76 pg_control_recoveryの列

列名データ型
min_recovery_end_lsnpg_lsn
min_recovery_end_timelineinteger
backup_start_lsnpg_lsn
backup_end_lsnpg_lsn
end_of_backup_record_requiredboolean