表 9.60に、セッションおよびシステムの情報を抽出する関数を示します。
本節で列挙されている関数のほかに、同様にシステム情報を提供する統計システムに関連した数多くの関数があります。 28.2.2にさらに情報があります。
表9.60 セッション情報関数
| 名前 | 戻り型 | 説明 |
|---|---|---|
| name | 現在のデータベースの名前(SQL標準では「カタログ」と呼ばれる) |
| name | 現在のデータベースの名前 |
| text | クライアントから提示された、現在実行中問い合わせのテキスト(複数の文を含むことあり) |
| name | current_userと同等 |
| name | 現在のスキーマの名前 |
| name[] | 検索パス内のスキーマの名前、オプションにより暗黙的なスキーマも含める |
| name | 現在の処理実施コンテキストのユーザ名 |
| inet | リモート接続のアドレス |
| int | リモート接続のポート |
| inet | ローカル接続のアドレス |
| int | ローカル接続のポート |
| int | 現在のセッションに結びついたサーバプロセスのプロセスID |
| int[] | 指定のサーバプロセスIDによるロック取得をブロックしているプロセスID |
| timestamp with time zone | 設定を読み込んだ時刻 |
| text | ログ収集機構が現在使用しているプライマリ、または指定のフォーマットのログのログファイルの名前 |
| oid | セッションの一時スキーマのOID、なければ0 |
| boolean | スキーマが他のセッションの一時スキーマかどうか? |
| boolean | is JITコンパイルがこのセッションで可能か?(第32章参照)
jitがfalseなら、falseを返します。 |
| setof text | 今のセッションにおいて現在待ち受け中のチャンネル名 |
| double | 非同期通知キューのうち、現在占められている割合(0から1まで) |
| timestamp with time zone | サーバの起動時刻 |
| int[] | 指定のサーバプロセスIDによる安全なスナップショットの取得をブロックしているプロセスID |
| int | PostgreSQLのトリガの現在の入れ子の深さ (直接的であれ間接的であれ、トリガ内部から呼ばれていなければ0を返す) |
| name | セッションのユーザ名 |
| name | current_userと等価 |
| text | PostgreSQLバージョン情報。機械読み取り可能なバージョンについてはserver_version_numを参照。 |
current_catalog、current_role、current_schema、current_user、session_userおよびuserはSQLにおいて特殊な構文上の地位を持っており、最後に括弧を付けずに呼び出さなければなりません。
(PostgreSQLではcurrent_schemaの場合括弧を使用することができますが、他は使えません。)
session_userは、通常、現在のデータベース接続を開始したユーザです。しかし、スーパーユーザはこの設定をSET SESSION AUTHORIZATIONを使用して変更することができます。
current_userは、権限の検査に適用されるユーザ識別子です。
通常はセッションユーザと同じですが、SET ROLEを使用して変更可能です。
SECURITY DEFINER属性を持つ関数の実行中にも変わります。
Unix用語で言うと、セッションユーザは「実ユーザ」で、現在のユーザは「実効ユーザ」です。
current_roleとuserはcurrent_userの同義語です。
(標準SQLではcurrent_roleとcurrent_userを区別していますが、PostgreSQLではユーザとロールを1種類のエンティティに統合しているため、両者に区別はありません。)
current_schema関数は、検索パスの最初にあるスキーマ名(もしくは、検索パスが空の場合はNULL値)を返します。
これは、対象スキーマを指定せずに作成される、すべてのテーブルまたは他の名前付きオブジェクトに使用されるスキーマです。
また、current_schemas(boolean) は、検索パスに存在する全てのスキーマ名の配列を返します。
booleanオプションにより、pg_catalogのような暗黙的に含まれているシステムスキーマを、結果の検索パスに含めるかどうかを指定します。
検索パスは、実行時に変更することができます。 使用するコマンドは以下の通りです。
SET search_path TOschema[,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は、順序リスト(stderr、csvlog)の最初に出てくる形式のファイルのパスを返します。
これらの形式のログファイルがないときはNULLが返されます。
特定のファイル形式を要求するには、オプションパラメータの値としてcsvlogまたはstderrをtextとして渡してください。
指定のログ形式がlog_destinationで設定されていない場合は、戻り値がNULLとなります。
pg_current_logfilesはcurrent_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 アクセス権限照会関数
| 名前 | 戻り型 | 説明 |
|---|---|---|
| boolean | ユーザがテーブルのどれか1つの列に対して権限を所有しているか |
| boolean | 現在のユーザがテーブルのどれか1つの列に対して権限を所有しているか |
| boolean | ユーザに列に対する権限があるか |
| boolean | 現在のユーザに列に対する権限があるか |
| boolean | ユーザにデータベースに対する権限があるのか |
| boolean | 現在のユーザにデータベースに対する権限があるのか |
| boolean | ユーザに外部データラッパに対する権限があるのか |
| boolean | 現在のユーザに外部データラッパに対する権限があるのか |
| boolean | ユーザに関数に対する権限があるのか |
| boolean | 現在のユーザに関数に対する権限があるのか |
| boolean | ユーザに言語に対する権限があるのか |
| boolean | 現在のユーザに言語に対する権限があるのか |
| boolean | ユーザにスキーマに対する権限があるのか |
| boolean | 現在のユーザにスキーマに対する権限があるのか |
| boolean | ユーザにシーケンスに対する権限があるのか |
| boolean | 現在のユーザにシーケンスに対する権限があるのか |
| boolean | ユーザに外部サーバに対する権限があるのか |
| boolean | 現在のユーザに外部サーバに対する権限があるのか |
| boolean | ユーザにテーブルに対する権限があるのか |
| boolean | 現在のユーザにテーブルに対する権限があるのか |
| boolean | ユーザにテーブル空間に対する権限があるのか |
| boolean | 現在のユーザにテーブル空間に対する権限があるのか |
| boolean | ユーザに型に対する権限があるのか |
| boolean | 現在のユーザに型に対する権限があるのか |
| boolean | ユーザにロールに対する権限があるのか |
| boolean | 現在のユーザにロールに対する権限があるのか |
| 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.19を参照)と同じ入力が可能です。
対象とするアクセス権限の種類は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.19参照)。
対象とするアクセス権限の種類はUSAGEである必要があります。
pg_has_roleは、ユーザが特定の方法でロールにアクセスできるかどうかを検査します。
取り得る引数については、publicがユーザ名として使用不可であることを除き、has_table_privilegeと類似しています。
対象とするアクセス権限の種類は、 MEMBER、USAGEの組み合わせである必要があります。
MEMBERは、ロールの直接または間接メンバ資格(つまり、SET ROLEを行う権限)を表します。一方、USAGEは、そのロール権限がSET ROLEをしなくてもすぐに利用できることを表します。
row_security_activeはcurrent_userと現在の環境において、指定のテーブルで行単位セキュリティが有効かどうかを検査します。
テーブルは名前またはOIDで指定できます。
表 9.62に、特定のオブジェクトが、現行スキーマの検索パスにおいて可視かどうかを判別する関数を示します。 例えば、あるテーブルを含むスキーマが検索パス内に存在し、検索パス内の前方に同じ名前のテーブルがない場合、そのテーブルは可視であると言います。 つまり、これは、テーブルが明示的なスキーマ修飾なしで名前によって参照可能であるということです。 全ての可視テーブルの名前を列挙するには以下のようにします。
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
表9.62 スキーマ可視性照会関数
| 名前 | 戻り型 | 説明 |
|---|---|---|
| boolean | 照合順序が検索パスにおいて可視かどうか |
| boolean | 変換が検索パスにおいて可視かどうか |
| boolean | 関数が検索パスにおいて可視であるか |
| boolean | 演算子クラスが検索パスにおいて可視であるか |
| boolean | 演算子が検索パスにおいて可視であるか |
| boolean | 演算子族が検索パスにおいて可視であるか |
| boolean | 統計情報オブジェクトが検索パスにおいて可視であるか |
| boolean | テーブルが検索パスにおいて可視かどうか |
| boolean | テキスト検索設定が検索パスにおいて可視かどうか |
| boolean | テキスト検索辞書が検索パスにおいて可視かどうか |
| boolean | テキスト検索パーサが検索パスにおいて可視かどうか |
| boolean | テキスト検索テンプレートが検索パスにおいて可視かどうか |
| boolean | 型(またはドメイン)が検索パスにおいて可視かどうか |
それぞれの関数はデータベースオブジェクトの1つの型に対して可視性の検査を行います。
pg_table_is_visibleがビュー、マテリアライズドビュー、インデックス、シーケンス、外部テーブルに対しても使用できること、pg_type_is_visibleがドメインに対しても使用できることに注意してください。
pg_function_is_visibleは手続きと集約にも使えます。
関数および演算子では、パスの前方に同じ名前かつ同じ引数のデータ型を持つオブジェクトが存在しなければ、検索パス内のオブジェクトは可視です。
演算子クラスでは、名前と関連するインデックスアクセスメソッドが考慮されます。
これらの関数は全て、検査するオブジェクトを識別するために、オブジェクトのOIDを必要とします。
オブジェクトを名前でテストする場合、OID別名型(regclass、regtype、regprocedure、regoperator、regconfig、またはregdictionary)を使用すると便利です。
例えば、以下のようにします。
SELECT pg_type_is_visible('myschema.widget'::regtype);
ただし、このようなやり方でスキーマ修飾されていない型名をテストしても、あまり意味がないことに注意してください。名前が認識されれば、それは必ず可視ということになります。
表 9.63に、システムカタログから情報を抽出する関数を列挙します。
表9.63 システムカタログ情報関数
| 名前 | 戻り型 | 説明 |
|---|---|---|
| text | データ型のSQL名を取得 |
| text | 制約の定義を取得 |
| text | 制約の定義を取得 |
| text | 式中のすべてのVarが2番目のパラメータによって指定されるリレーションを参照すると仮定して、式の内部形式を逆コンパイル |
| text | 式中のすべてのVarが2番目のパラメータによって指定されるリレーションを参照すると仮定して、式の内部形式を逆コンパイル |
| text | 関数あるいは手続きの定義の取得 |
| text | 関数あるいは手続きの定義の引数リスト(デフォルト値付き)を取得 |
| text | 関数あるいは手続きを特定するための引数リスト(デフォルト値なし)を取得 |
| text | 関数に対するRETURNS句の取得(プロシージャに対してはNULLを返します) |
| text | インデックスに対するCREATE INDEXコマンドの取得 |
| text | インデックスに対するCREATE INDEXコマンドの取得、またはcolumn_noが非ゼロの場合は、1つのインデックス列のみの定義の取得 |
| setof record | SQLキーワードとそれらの種類のリストを取得 |
| text | ルールに対するCREATE RULEコマンドを取得 |
| text | ルールに対するCREATE RULEコマンドを取得 |
| text | SERIAL、またはIDENTITY列が使用するシーケンス名を取得 |
| text | 拡張統計情報オブジェクトのCREATE STATISTICSコマンドを取得 |
pg_get_triggerdef(trigger_oid) | text | トリガに対するCREATE [ CONSTRAINT ] TRIGGERコマンドの取得 |
pg_get_triggerdef(trigger_oid, pretty_bool) | text | トリガに対するCREATE [ CONSTRAINT ] TRIGGERコマンドの取得 |
| name | 与えられたOIDでロール名を取得 |
| text | ビューまたはマテリアライズドビューの元になるSELECTコマンドを取得(廃止予定) |
| text | ビューまたはマテリアライズドビューの元になるSELECTコマンドを取得(廃止予定) |
| text | ビューまたはマテリアライズドビューの元になるSELECTコマンドを取得 |
| text | ビューまたはマテリアライズドビューの元になるSELECTコマンドを取得 |
| text | ビューまたはマテリアライズドビューの元になるSELECTコマンドを取得。
フィールドを含む行は指定された列数で折り返され、成形された表示が行われます。 |
| boolean | インデックス列が指定の属性を持っているかどうか検査する |
| boolean | インデックスが指定の属性を持っているかどうか検査する |
| boolean | インデックスアクセスメソッドが指定の属性を持っているかどうか検査する |
| setof record | 格納オプションの名前/値のペアのセットを取得 |
| setof oid | テーブル空間内にオブジェクトを所有するデータベースOID集合を取得 |
| text | 指定したテーブル空間が実際に配置されているファイルシステム上のパスを取得 |
| regtype | 指定した値のデータ型を取得 |
| text | 引数の照合順序を取得 |
| regclass | 指定のリレーションのOIDを取得 |
| regproc | 指定の関数のOIDを取得 |
| regprocedure | 指定の関数のOIDを取得 |
| regoper | 指定の演算子のOIDを取得 |
| regoperator | 指定の演算子のOIDを取得 |
| regtype | 指定の型のOIDを取得 |
| regnamespace | 指定のスキーマのOIDを取得 |
| 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_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型(serial、smallserial、bigserial)の一つを使って作られた列については、その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_property、pg_index_has_property、pg_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においてASC、DESCおよび関連するキーワードをサポートしているか
|
can_unique | アクセスメソッドは一意インデックスをサポートしているか |
can_multi_col | アクセスメソッドは複数列にまたがるインデックスをサポートしているか |
can_exclude | アクセスメソッドは除外制約をサポートしているか |
can_include | アクセスメソッドがCREATE INDEXのINCLUDE句をサポートしているか |
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.19を参照)。つまり、比較が目的なら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関数はリレーション、関数、演算子、型、スキーマ、ロールの名前(textとして渡されます)をそれぞれregclass、regproc、regprocedure、regoper、regoperator、regtype、regnamespace、regrole型のオブジェクトに変換します。
数値OIDを受け付けず、名前が見つからない(もしくは、to_regprocとto_regoperでは、与えられた名前が複数のオブジェクトに一致する)場合にはエラーを発生するのではなくnullを返すという点で、これらの関数はテキストからのキャストとは異なります。
表 9.67にデータベースオブジェクトの識別とアドレスに関連する関数を示します。
表9.67 オブジェクト情報とアドレスの関数
| 名前 | 戻り型 | 説明 |
|---|---|---|
| text | データベースオブジェクトの説明の取得 |
| type text, schema text, name text, identity text | データベースオブジェクトの識別の取得 |
| type text, object_names text[], object_args text[] | データベースオブジェクトのアドレスの外部表現を取得 |
| classid oid, objid oid, objsubid integer | データベースオブジェクトのアドレスの外部表現から、アドレスを取得 |
pg_describe_objectはカタログOID、オブジェクトOID、もしくはサブオブジェクトOID(たとえばテーブル中の列番号。オブジェクト全体を参照している場合は0)で指定されたデータベースオブジェクトのテキストによる説明を返します。
この説明はサーバの設定に依存しますが、人が読んでわかる、そして翻訳も可能になることを目的としたのもです。
これはpg_dependカタログに格納されたオブジェクトの識別判断の際に有用です。
pg_identify_objectはカタログOID、オブジェクトOID、そしてサブオブジェクトIDにより指定されるデータベースオブジェクトを一意に特定するために十分な情報を含む行を返します。
この情報は機械による読み取りを目的としており、決して翻訳されません。
typeはデータベースオブジェクトの型を識別するものです。
schemaはオブジェクトが所属するスキーマの名前ですが、スキーマに所属しないオブジェクト型の場合はNULLになります。
nameは(必要なら引用符で括った)オブジェクトの名前ですが、(適切ならスキーマ名と合わせて)オブジェクトの一意識別子として使用できる場合にのみ指定し、それ以外の場合はNULLにします。
identityは完全なオブジェクトの識別で、オブジェクトの型に依存した正確なフォーマットを持っています。
フォーマット内の各部分はスキーマ修飾されており、必要に応じて引用符で括られます。
pg_identify_object_as_addressはカタログOID、オブジェクトOID、そしてサブオブジェクトIDにより指定されるデータベースオブジェクトを一意に特定するために充分な情報を含む行を返します。
返される情報は現在のサーバに依存しません。
つまり、他のサーバで全く同じ名前を付けられたオブジェクトを識別するために使うことができます。
typeはデータベースオブジェクトの型を識別するものです。
object_namesとobject_argsは文字列の配列で、それらが組み合わされてオブジェクトへの参照を構成します。
これらの3つの値は、オブジェクトの内部アドレスを取得するためにpg_get_object_addressに渡すことができます。
この関数はpg_get_object_addressの逆関数です。
pg_get_object_addressは、型、オブジェクト名および引数の配列で指定されたデータベースオブジェクトを一意に特定するために十分な情報を含む行を返します。
返される値は、pg_dependなどのシステムカタログで使用されるもので、pg_identify_objectやpg_describe_objectなど他のシステム関数に渡すことができます。
classidはオブジェクトを含むシステムカタログのOIDです。
objidはオブジェクト自体のOIDです。
objsubidはオブジェクトのサブID、なければ0です。
この関数はpg_identify_object_as_addressの逆関数です。
表 9.68に示される関数は、COMMENTコマンドによって以前に保存されたコメントを抽出します。 指定されたパラメータに対するコメントが存在しない場合、NULL値が返されます。
表9.68 コメント情報関数
| 名前 | 戻り型 | 説明 |
|---|---|---|
| text | テーブル列のコメントを取得 |
| text | データベースオブジェクトのコメントを取得 |
| text | データベースオブジェクトのコメントを取得(廃止予定) |
| 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とスナップショット
| 名前 | 戻り型 | 説明 |
|---|---|---|
| bigint | 現在のトランザクションIDの取得、現在のトランザクションにIDがなければ新規に割り当てる |
| bigint | txid_current()と同じだが、まだトランザクションIDが割り当てられていなければ、新規に割り当てずにNULLを返す |
| txid_snapshot | 現在のスナップショットの取得 |
| setof bigint | スナップショットにある進行中のトランザクションIDの取得 |
| bigint | スナップショットのxmaxの取得 |
| bigint | スナップショットのxminの取得 |
| boolean | スナップショットにあるトランザクションIDは可視か?(サブトランザクションIDで使用しないこと) |
| text | 指定のトランザクションのステータス(committed、aborted、in 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。
リストはxminとxmax間の実行中のtxidのみを含む。
xmaxより高位で実行中のtxidが存在することもある。
xmin <= txid < xmaxであり、このリストにないtxidはスナップショット時に既に完了しており、従って、コミット状態によって、可視か消滅かのいずれか。
リストには副トランザクションのtxidは含まれない。
|
txid_snapshotのテキスト表現はです。
例えば、xmin:xmax:xip_list10:20:10,14,15はxmin=10, xmax=20, xip_list=10, 14, 15を意味します。
txid_status(bigint)は最近のトランザクションのコミット状態について報告します。
COMMITの進行中にアプリケーションとデータベースが切断されたときに、アプリケーションはトランザクションがコミットされたか中断されたかを知るためにこれを使うことができます。
トランザクションが最近のもので、システムがそのトランザクションのコミット状態を保持している場合は、トランザクションの状態はin progress、committedあるいはabortedとして報告されます。
トランザクションが古く、その参照がシステムに残っておらず、コミット状態の情報が破棄されている場合は、この関数はNULLを返します。
プリペアドのトランザクションはin progressとして報告されること、そして指定のtxidがプリペアドのトランザクションかどうかを確認する必要がある場合は、アプリケーションはpg_prepared_xactsを調べなければならないことに注意してください。
表 9.71に示す関数は、コミット済みのトランザクションに関する情報を提供します。 これらの関数は主に、トランザクションがいつコミットされたかについての情報を提供します。 これらは、設定オプションtrack_commit_timestampが有効な時にのみ、しかもそれが有効にされた後にコミットされたトランザクションについてのみ有意なデータを提供します。
表9.71 コミットされたトランザクションの情報
表 9.72に示す関数は、カタログのバージョンなどといったinitdbの実行時に初期化される情報を表示します。
それらはまた、先行書き込みログとチェックポイント処理についての情報も示します。
この情報はクラスタ全体に渡るもので、どれか1つのデータベースに特有のものではありません。
それらはpg_controldataと同じ情報源から、ほぼ同じ情報を提供しますが、SQL関数により適した形式になります。
表9.72 制御データ関数
pg_control_checkpointは表 9.73に示すレコードを返します。
表9.73 pg_control_checkpointの列
| 列名 | データ型 |
|---|---|
checkpoint_lsn | pg_lsn |
redo_lsn | pg_lsn |
redo_wal_file | text |
timeline_id | integer |
prev_timeline_id | integer |
full_page_writes | boolean |
next_xid | text |
next_oid | oid |
next_multixact_id | xid |
next_multi_offset | xid |
oldest_xid | xid |
oldest_xid_dbid | oid |
oldest_active_xid | xid |
oldest_multi_xid | xid |
oldest_multi_dbid | oid |
oldest_commit_ts_xid | xid |
newest_commit_ts_xid | xid |
checkpoint_time | timestamp with time zone |
pg_control_systemは表 9.74に示すレコードを返します。
表9.74 pg_control_systemの列
| 列名 | データ型 |
|---|---|
pg_control_version | integer |
catalog_version_no | integer |
system_identifier | bigint |
pg_control_last_modified | timestamp with time zone |
pg_control_initは表 9.75に示すレコードを返します。
表 9.75
表9.75 pg_control_initの列
| 列名 | データ型 |
|---|---|
max_data_alignment | integer |
database_block_size | integer |
blocks_per_segment | integer |
wal_block_size | integer |
bytes_per_wal_segment | integer |
max_identifier_length | integer |
max_index_columns | integer |
max_toast_chunk_size | integer |
large_object_chunk_size | integer |
float4_pass_by_value | boolean |
float8_pass_by_value | boolean |
data_page_checksum_version | integer |
pg_control_recoveryは表 9.76に示すレコードを返します。
表 9.76
表9.76 pg_control_recoveryの列
| 列名 | データ型 |
|---|---|
min_recovery_end_lsn | pg_lsn |
min_recovery_end_timeline | integer |
backup_start_lsn | pg_lsn |
backup_end_lsn | pg_lsn |
end_of_backup_record_required | boolean |