PostgreSQL 9.5.4文書 | |||
---|---|---|---|
前のページ | 上に戻る | 第 9章関数と演算子 | 次のページ |
表9-57に、セッションおよびシステムの情報を抽出する関数を示します。
本節で列挙されている関数のほかに、同様にシステム情報を提供する統計システムに関連した数多くの関数があります。 項27.2.2にさらに情報があります。
表 9-57. セッション情報関数
名前 | 戻り型 | 説明 |
---|---|---|
current_catalog | name | 現在のデータベースの名前(SQL標準では"カタログ"と呼ばれる) |
current_database() | name | 現在のデータベースの名前 |
current_query() | text | クライアントから提示された、現在実行中問い合わせのテキスト(複数の文を含むことあり) |
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_backend_pid() | int | 現在のセッションに結びついたサーバプロセスのプロセスID |
pg_conf_load_time() | timestamp with time zone | 設定を読み込んだ時刻 |
pg_is_other_temp_schema(oid) | boolean | スキーマが他のセッションの一時スキーマかどうか? |
pg_listening_channels() | setof text | 今のセッションにおいて現在待ち受け中のチャンネル名 |
pg_my_temp_schema() | oid | セッションの一時スキーマのOID。もしなければ0 |
pg_postmaster_start_time() | timestamp with time zone | サーバの起動時刻 |
pg_trigger_depth() | int | PostgreSQLのトリガの現在の入れ子の深さ (直接的であれ間接的であれ、トリガ内部から呼ばれていなければ0を返す) |
session_user | name | セッションのユーザ名 |
user | name | current_user と等価 |
version() | text | PostgreSQLバージョン情報。機械読み取り可能なバージョンについてはserver_version_numを参照。 |
注意:
current_catalog
、current_schema
、current_user
、session_user
およびuser
はSQLにおいて特殊な構文上の地位を持っており、最後に括弧を付けずに呼び出さなければなりません。 (PostgreSQLではcurrent_schema
の場合括弧を使用することができますが、他は使えません。)
session_user
は、通常、現在のデータベース接続を開始したユーザです。しかし、スーパユーザはこの設定をSET SESSION AUTHORIZATIONを使用して変更することができます。
current_user
は、権限の検査に適用されるユーザ識別子です。
通常はセッションユーザと同じですが、SET ROLEを使用して変更可能です。
SECURITY DEFINER属性を持つ関数の実行中にも変わります。
Unix用語で言うと、セッションユーザは"実ユーザ"で、現在のユーザは"実効ユーザ"です。
current_schema
関数は、検索パスの最初にあるスキーマ名(もしくは、検索パスが空の場合はNULL値)を返します。
これは、対象スキーマを指定せずに作成される、すべてのテーブルまたは他の名前付きオブジェクトに使用されるスキーマです。
また、current_schemas(boolean)
は、検索パスに存在する全てのスキーマ名の配列を返します。
booleanオプションにより、pg_catalogのような暗黙的に含まれているシステムスキーマを、結果の検索パスに含めるかどうかを指定します。
注意: 検索パスは、実行時に変更することができます。 使用するコマンドは以下の通りです。
SET search_path TO schema [, schema, ...]
pg_listening_channels
は、現在のセッションで待ち受け中のチャンネル名のセットを返します。
詳細はLISTENを参照して下さい。
inet_client_addr
は現在のクライアントのIPアドレスを返し、inet_client_port
はそのポート番号を返します。
inet_server_addr
は、現在の接続を受け付けたサーバのIPアドレスを返し、inet_server_port
はそのポート番号を返します。
これら全ての関数は接続がUnixドメインソケット経由の場合NULLを返します。
pg_my_temp_schema
は、現在のセッションの一時スキーマのOIDを返します。(一時テーブルをまだ1つも作成しておらず)存在しなければゼロを返します。
pg_is_other_temp_schema
は、指定したOIDが他のセッションの一時スキーマのOIDであれば、真を返します。
(例えば、他のセッションの一時テーブルをカタログ表示から除外したい場合などで有用です。)
pg_postmaster_start_time
はサーバが起動した時のtimestamp with time zoneを返します。
pg_conf_load_time
はサーバの設定ファイルが最後に読み込まれた時のtimestamp with time zoneを返します。
(現在のセッションがその時点で稼働していた場合、これはセッション自体が設定ファイルを読み込んだ時刻となります。
このためこの読み取った結果は多少他のセッションと異なります。
この他の場合は、postmasterプロセスが設定ファイルを再読み込みした時刻となります。)
version
関数はPostgreSQLサーバのバージョンを記述した文字列を返します。
この情報はserver_versionでも取得できますし、機械読み取り可能なバージョンはserver_version_numで取得できます。
ソフトウェア開発者はテキスト版の結果を解析するのではなく、server_version_num(バージョン8.2以降で利用可能)あるいは PQserverVersion
を利用すべきです。
表9-58に列挙した関数を使用して、ユーザはオブジェクトのアクセス権限をプログラムから問い合わせることができます。 権限についての詳細は、項5.6を参照してください。
表 9-58. アクセス権限照会関数
名前 | 戻り型 | 説明 |
---|---|---|
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 | 現在のユーザにテーブル空間に対する権限があるのか |
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つの変形があり、引数の数と型で区別されます。)
名前を指定する場合、必要であればスキーマ修飾できます。
対象とするアクセス権限の種類はテキスト文字列で指定され、それは、SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、または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
に対するものと類似しています。
対象とする権限の種類はUSAGE、SELECTまたはUPDATEのいずれかである必要があります。
has_any_column_privilege
はユーザが特定の方法でテーブルのどれか1つの列にアクセス可能かどうかを検査します。
取り得る引数はhas_table_privilege
に対するものと類似していますが、対象とする権限の種類がSELECT、INSERT、UPDATE、またはREFERENCESの組み合わせである必要がある点を除きます。
テーブル単位でこれらの権限を所有することは、テーブルのそれぞれの列に対し暗黙的にそれらの権限を与えることになるため、has_table_privilege
が真を返す場合は、同一の引数に対してhas_any_column_privilege
は常に真を返すということに注意して下さい。
しかし、少なくとも一つの列に対し権限の列単位の許可がある場合にもhas_any_column_privilege
は成功します。
has_column_privilege
はユーザが特定の方法でテーブルのある列にもアクセス可能かどうかを検査します。
取り得る引数はhas_table_privilege
と類似していますが、名前または属性番号のいずれかで列の指定が追加されます。
対象とするアクセス権限の種類はSELECT、INSERT、UPDATE、またはREFERENCESの組み合わせでなければなりません。
テーブル単位のこれらの権限を所有することは、テーブルのそれぞれの列に対し暗黙的にそれら権限を与えることに注意してください。
has_database_privilege
関数は、ユーザが特定の方法でデータベースにアクセス可能かどうかを検査します。
取り得る引数は、has_table_privilege
に類似しています。
対象とするアクセス権限の種類はCREATE、CONNECT、TEMPORARY、またはTEMP(TEMPORARYと同じ)の組み合わせである必要があります。
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である必要があります。
pg_has_role
は、ユーザが特定の方法でロールにアクセスできるかどうかを検査します。
取り得る引数については、publicがユーザ名として使用不可であることを除き、has_table_privilege
と類似しています。
対象とするアクセス権限の種類は、 MEMBER、USAGEの組み合わせである必要があります。
MEMBERは、ロールの直接または間接メンバ資格(つまり、SET ROLEを行う権限)を表します。一方、USAGEは、そのロール権限がSET ROLEをしなくてもすぐに利用できることを表します。
row_security_active
はcurrent_user
と現在の環境において、指定のテーブルで行単位セキュリティが有効かどうかを検査します。
テーブルは名前またはOIDで指定できます。
表9-59に、特定のオブジェクトが、現行スキーマの検索パスにおいて可視かどうかを判別する関数を示します。 例えば、あるテーブルを含むスキーマが検索パス内に存在し、検索パス内の前方に同じ名前のテーブルがない場合、そのテーブルは可視であると言います。 つまり、これは、テーブルが明示的なスキーマ修飾なしで名前によって参照可能であるということです。 全ての可視テーブルの名前を列挙するには以下のようにします。
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
表 9-59. スキーマ可視性照会関数
名前 | 戻り型 | 説明 |
---|---|---|
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_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別名型(regclass、regtype、regprocedure、regoperator、regconfig、またはregdictionary)を使用すると便利です。 例えば、以下のようにします。
SELECT pg_type_is_visible('myschema.widget'::regtype);
ただし、このようなやり方でスキーマ修飾されていない型名をテストしても、あまり意味がないことに注意してください。名前が認識されれば、それは必ず可視ということになります。
表9-60に、システムカタログから情報を抽出する関数を列挙します。
表 9-60. システムカタログ情報関数
名前 | 戻り型 | 説明 |
---|---|---|
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 record | SQLキーワードとそれらの種類のリストを取得 |
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、smallserial、またはbigserial列が使用するシーケンス名の取得 |
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_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_constraintdef
、pg_get_indexdef
、pg_get_ruledef
、および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を返します。
最初の入力パラメータはテーブル名です。スキーマを付けることもできます。2番目のパラメータは列名です。
最初のパラメータは普通スキーマとテーブルですので、二重引用符付の識別子としては解釈されません。つまり、デフォルトで小文字に変換されます。一方2番目のパラメータは単なる列名であり、二重引用符付として解釈され、その大文字小文字は保持されます。
この関数は、シーケンス関数に渡すことができるよう適切な書式で値を返します(項9.16を参照)。
この関連付けはALTER SEQUENCE OWNED BYにより変更、削除することができます。
(この関数はおそらくpg_get_owned_sequence
と呼ばれるべきでした。現在の名前は、通常はserialやbigserial列で使われることからきています。)
pg_get_userbyid
はそのOIDで与えられたロールの名前を抽出します。
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_regclass
、to_regproc
、to_regprocedure
、to_regoper
、to_regoperator
、to_regtype
、to_regnamespace
、to_regrole
関数はリレーション、関数、演算子、型、スキーマ、ロールの名前をそれぞれregclass、regproc、regprocedure、regoper、regoperator、regtype、regnamespace、regrole型のオブジェクトに変換します。
数値OIDを受け付けず、名前が見つからない(もしくは、to_regproc
とto_regoper
では、与えられた名前が複数のオブジェクトに一致する)場合にはエラーを発生するのではなくnullを返すという点で、これらの関数はテキストからのキャストとは異なります。
表9-61にデータベースオブジェクトの識別とアドレスに関連する関数を示します。
表 9-61. オブジェクト情報とアドレスの関数
名前 | 戻り型 | 説明 |
---|---|---|
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はデータベースオブジェクトの型を識別するものです。
nameとargsは文字列の配列で、それらが組み合わされてオブジェクトへの参照を構成します。
これらの3つの列は、オブジェクトの内部アドレスを取得するためにpg_get_object_address
に渡すことができます。
この関数はpg_get_object_address
の逆関数です。
pg_get_object_address
は、型、オブジェクト名および引数の配列で指定されたデータベースオブジェクトを一意に特定するために十分な情報を含む行を返します。
返される値は、pg_dependなどのシステムカタログで使用されるもので、pg_identify_object
やpg_describe_object
など他のシステム関数に渡すことができます。
catalog_idはオブジェクトを含むシステムカタログのOIDです。
object_idはオブジェクト自体のOIDです。
object_sub_idはオブジェクトのサブID、なければ0です。
この関数はpg_identify_object_as_address
の逆関数です。
表9-62に示される関数は、COMMENTコマンドによって以前に保存されたコメントを抽出します。 指定されたパラメータに対するコメントが存在しない場合、NULL値が返されます。
表 9-62. コメント情報関数
名前 | 戻り型 | 説明 |
---|---|---|
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-63で示される関数はサーバトランザクション情報をエクスポートできる形式で提供します。 これら関数の主な使用目的は2つのスナップショット間でどちらのトランザクションがコミットされたのかを特定するためです。
表 9-63. トランザクションIDとスナップショット
名前 | 戻り型 | 説明 |
---|---|---|
txid_current() | bigint | 現在のトランザクションIDの取得、現在のトランザクションにIDがなければ新規に割り当てる |
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で使用しないこと) |
内部トランザクションID型(xid)は32ビット幅なので40億トランザクション毎にラップします。 とは言っても、これらの関数は"epoch"カウンタにより拡張された64ビット形式をエクスポートするため、インストレーションの生涯にわたってラップしないでしょう。 これらの関数で使用されるデータ型、txid_snapshotはある特定の時間におけるトランザクションIDの可視性に関する情報を格納します。 構成要素は表9-64に記載されています。
表 9-64. スナップショット構成要素
名前 | 説明 |
---|---|
xmin | 現在実行中で最も早いトランザクションID(txid)。 これより早い全てのトランザクションはコミットされて可視となっているか、またはロールバックされて消滅している。 |
xmax | まだ割り当てられていない最初のtxid。 これと等しいかより大きい全てのtxidはスナップショットの時点で未開始であり、従って不可視。 |
xip_list | スナップショット時の実行中のtxid。 リストはxminとxmax間の実行中のtxidのみを含む。 xmaxより高位で実行中のtxidが存在することもある。 xmin <= txid < xmaxであり、このリストにないtxidはスナップショット時に既に完了しており、従って、コミット状態によって、可視か消滅かのいずれか。 リストには副トランザクションのtxidは含まれない。 |
txid_snapshotのテキスト表現はxmin:xmax:xip_listです。 例えば、10:20:10,14,15はxmin=10, xmax=20, xip_list=10, 14, 15を意味します。
表9-65に示す関数は、コミット済みのトランザクションに関する情報を提供します。 これらの関数は主に、トランザクションがいつコミットされたかについての情報を提供します。 これらは、設定オプションtrack_commit_timestampが有効な時にのみ、しかもそれが有効にされた後にコミットされたトランザクションについてのみ有意なデータを提供します。