表 9.63に、セッションおよびシステムの情報を抽出する関数を示します。
本節で列挙されている関数のほかに、同様にシステム情報を提供する統計システムに関連した数多くの関数があります。 27.2.2にさらに情報があります。
表9.63 セッション情報関数
名前 | 戻り型 | 説明 |
---|---|---|
| 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 | JITコンパイラ拡張が利用可能で(第31章参照)
jit設定パラメータがon か? |
| 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.64に列挙した関数を使用して、ユーザはオブジェクトのアクセス権限をプログラムから問い合わせることができます。 権限についての詳細は、5.7を参照してください。
表9.64 アクセス権限照会関数
名前 | 戻り型 | 説明 |
---|---|---|
| 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で指定できます。
アクセス権限のカタログ表現であるaclitem
型で利用可能な演算子を表 9.65に示します。
アクセス権限値を解釈する方法に関する情報は5.7をご覧ください。
表9.65 aclitem
演算子
演算子 | 説明 | 例 | 結果 |
---|---|---|---|
= | 等しい | 'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitem | f |
@> | 要素を含む | '{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @> 'calvin=r*w/hobbes'::aclitem | t |
~ | 要素を含む | '{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*w/hobbes'::aclitem | t |
表 9.66にaclitem
型を管理する追加の関数を示します。
表9.66 aclitem
関数
名称 | 戻り型 | 説明 |
---|---|---|
| aclitem[] | ownerId に所属するオブジェクトのデフォルトアクセス権限を得る |
| setof record | aclitem 配列をタプルとして得る |
| aclitem | 入力からaclitem を構築する |
acldefault
はownerId
ロールに所属するtype
型のオブジェクトの組み込みデフォルトアクセス権限を返します。
これらはオブジェクトのACLエントリがNULLの時に持つと見なされるアクセス権限を表現します。
(デフォルトアクセス権限は5.7で説明されています。)
type
パラメータはCHAR
であり、'c'でCOLUMN
、'r'でTABLE
およびテーブルに見えるオブジェクト、's'でSEQUENCE
、'd'でDATABASE
、'f'でFUNCTION
あるいはPROCEDURE
、'l'でLANGUAGE
、'L'でLARGE OBJECT
、'n'でSCHEMA
、't'でTABLESPACE
、'F'でFOREIGN DATA WRAPPER
、'S'でFOREIGN SERVER
、'T'でTYPE
あるいはDOMAIN
を表します。
aclexplode
は行の集合としてaclitem
配列を返します。
出力列はアクセス権を与える側のoid
、アクセス権を与えられる側のoid
(0
でPUBLIC
を表します)、与えられた権限text
(SELECT
, ...)、権限が許可可能かどうかのboolean
です。
makeaclitem
は逆の操作を実行します。
表 9.67に、特定のオブジェクトが、現行スキーマの検索パスにおいて可視かどうかを判別する関数を示します。 例えば、あるテーブルを含むスキーマが検索パス内に存在し、検索パス内の前方に同じ名前のテーブルがない場合、そのテーブルは可視であると言います。 つまり、これは、テーブルが明示的なスキーマ修飾なしで名前によって参照可能であるということです。 全ての可視テーブルの名前を列挙するには以下のようにします。
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
表9.67 スキーマ可視性照会関数
名前 | 戻り型 | 説明 |
---|---|---|
| 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.68に、システムカタログから情報を抽出する関数を列挙します。
表9.68 システムカタログ情報関数
名前 | 戻り型 | 説明 |
---|---|---|
| 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.69、インデックスの属性については表 9.70、アクセスメソッドの属性については表 9.71を参照して下さい。
(拡張のアクセスメソッドはそのインデックスについて追加の属性名を定義できることに注意して下さい。)
表9.69 インデックス列の属性
名前 | 説明 |
---|---|
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.70 インデックスの属性
名前 | 説明 |
---|---|
clusterable | インデックスをCLUSTER コマンドで使うことができるか
|
index_scan | インデックスは通常の(ビットマップでない)スキャンをサポートしているか |
bitmap_scan | インデックスはビットマップスキャンをサポートしているか |
backward_scan | スキャンの途中でスキャン方向を変更できるか(マテリアライゼーションを必要とせずにカーソルの FETCH BACKWARD をサポートするため)
|
表9.71 インデックスアクセスメソッドの属性
名前 | 説明 |
---|---|
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.72にデータベースオブジェクトの識別とアドレスに関連する関数を示します。
表9.72 オブジェクト情報とアドレスの関数
名前 | 戻り型 | 説明 |
---|---|---|
| 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.73に示される関数は、COMMENTコマンドによって以前に保存されたコメントを抽出します。 指定されたパラメータに対するコメントが存在しない場合、NULL値が返されます。
表9.73 コメント情報関数
名前 | 戻り型 | 説明 |
---|---|---|
| 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.74で示される関数はサーバトランザクション情報をエクスポートできる形式で提供します。 これら関数の主な使用目的は2つのスナップショット間でどちらのトランザクションがコミットされたのかを特定するためです。
表9.74 トランザクション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.75に記載されています。
表9.75 スナップショット構成要素
名前 | 説明 |
---|---|
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
を意味します。
txid_status(bigint)
は最近のトランザクションのコミット状態について報告します。
COMMIT
の進行中にアプリケーションとデータベースが切断されたときに、アプリケーションはトランザクションがコミットされたか中断されたかを知るためにこれを使うことができます。
トランザクションが最近のもので、システムがそのトランザクションのコミット状態を保持している場合は、トランザクションの状態はin progress
、committed
あるいはaborted
として報告されます。
トランザクションが古く、その参照がシステムに残っておらず、コミット状態の情報が破棄されている場合は、この関数はNULLを返します。
プリペアドのトランザクションはin progress
として報告されること、そして指定のtxidがプリペアドのトランザクションかどうかを確認する必要がある場合は、アプリケーションはpg_prepared_xacts
を調べなければならないことに注意してください。
表 9.76に示す関数は、コミット済みのトランザクションに関する情報を提供します。 これらの関数は主に、トランザクションがいつコミットされたかについての情報を提供します。 これらは、設定オプションtrack_commit_timestampが有効な時にのみ、しかもそれが有効にされた後にコミットされたトランザクションについてのみ有意なデータを提供します。
表9.76 コミットされたトランザクションの情報
表 9.77に示す関数は、カタログのバージョンなどといったinitdb
の実行時に初期化される情報を表示します。
それらはまた、先行書き込みログとチェックポイント処理についての情報も示します。
この情報はクラスタ全体に渡るもので、どれか1つのデータベースに特有のものではありません。
それらはpg_controldataと同じ情報源から、ほぼ同じ情報を提供しますが、SQL関数により適した形式になります。
表9.77 制御データ関数
pg_control_checkpoint
は表 9.78に示すレコードを返します。
表9.78 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.79に示すレコードを返します。
表9.79 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.80に示すレコードを返します。
表 9.80
表9.80 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.81に示すレコードを返します。
表 9.81
表9.81 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 |