システム情報関数

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 9章関数と演算子 | 早送り | 次のページ

# 9.19. システム情報関数

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

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

名前 | 戻り値の型 | 説明
--- | --- | ---
`current_database()` | `name` | 現在のデータベースの名前
`current_schema()` | `name` | 現在のスキーマの名前
`current_schemas(boolean)` | `name[]` | 検索パス内のスキーマの名前。オプションで暗黙的なスキーマも含む
`current_user` | `name` | 現在の実行コンテキストのユーザ名。
`inet_client_addr()` | `inet` | リモート接続のアドレス。
`inet_client_port()` | `int4` | リモート接続のポート。
`inet_server_addr()` | `inet` | ローカル接続のアドレス。
`inet_server_port()` | `int4` | ローカル接続のポート。
`session_user` | `name` | セッションユーザ名。
`user` | `name` | `current_user`と等価。
`version()` | `text` | PostgreSQL バージョン情報。

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

> 注意: `current_user`、`session_user`および`user`はSQLにおいて特殊な状態を持っており、括弧をつけずに呼び出さなければなりません。

`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を返します。

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

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

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

名前 | 戻り値型 | 説明
--- | --- | ---
``has_table_privilege`(`user`, `table`, `privilege`)` | `boolean` | テーブルにユーザのアクセス権限があるのか
``has_table_privilege`(`table`, `privilege`)` | `boolean` | テーブルに現在のユーザのアクセス権限があるのか
``has_database_privilege`(`user`, `database`, `privilege`)` | `boolean` | ユーザにデータベースへのアクセス権限があるのか
``has_database_privilege`(`database`, `privilege`)` | `boolean` | 現在のユーザにデータベースへのアクセス権限があるのか
``has_function_privilege`(`user`, `function`, `privilege`)` | `boolean` | ユーザに関数へのアクセス権限があるのか
``has_function_privilege`(`function`, `privilege`)` | `boolean` | 現在のユーザに関数へのアクセス権限があるのか
``has_language_privilege`(`user`, `language`, `privilege`)` | `boolean` | ユーザに言語へのアクセス権限があるのか
``has_language_privilege`(`language`, `privilege`)` | `boolean` | 現在のユーザに言語へのアクセス権限があるのか
``has_schema_privilege`(`user`, `schema`, `privilege`)` | `boolean` | ユーザにスキーマへのアクセス権限があるのか
``has_schema_privilege`(`schema`, `privilege`)` | `boolean` | 現在のユーザにスキーマへのアクセス権限があるのか
``has_tablespace_privilege`(`user`, `tablespace`, `privilege`)` | `boolean` | ユーザにテーブル空間へのアクセス権限があるのか
``has_tablespace_privilege`(`tablespace`, `privilege`)` | `boolean` | 現在のユーザにテーブル空間へのアクセス権限があるのか

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

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

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

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

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

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

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

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

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

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

    SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

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

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

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

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

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

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

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

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

名前 | 戻り値型 | 説明
--- | --- | ---
``pg_get_viewdef`(`view_name`)` | `text` | ビューの`CREATE VIEW`コマンドの取得(廃止予定)
``pg_get_viewdef`(`view_name`, `pretty_bool`)` | `text` | ビューの`CREATE VIEW`コマンドの取得(廃止予定)
``pg_get_viewdef`(`view_oid`)` | `text` | ビューの`CREATE VIEW`コマンドの取得
``pg_get_viewdef`(`view_oid`, `pretty_bool`)` | `text` | ビューの`CREATE VIEW`コマンドの取得
``pg_get_ruledef`(`rule_oid`)` | `text` | ルールの`CREATE RULE`コマンドの取得
``pg_get_ruledef`(`rule_oid`, `pretty_bool`)` | `text` | ルールの`CREATE RULE`コマンドの取得
``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_triggerdef`(`trigger_oid`) | `text` | トリガの`CREATE [ CONSTRAINT ] TRIGGER`コマンドの取得
``pg_get_constraintdef`(`constraint_oid`)` | `text` | 制約定義の取得
``pg_get_constraintdef`(`constraint_oid`, `pretty_bool`)` | `text` | 制約定義の取得
``pg_get_expr`(`expr_text`, `relation_oid`)` | `text` | 式の内部形式の逆コンパイル。 式中の変数は第二パラメータで示されたリレーションを参照しているものと仮定。
``pg_get_expr`(`expr_text`, `relation_oid`, `pretty_bool`)` | `text` | 式の内部形式の逆コンパイル。 式中の変数は第二パラメータで示されたリレーションを参照しているものと仮定。
``pg_get_userbyid`(`userid`)` | `name` | 与えられたIDを持つユーザ名を取得
``pg_get_serial_sequence`(`table_name`, `column_name`)` | `text` | `serial`もしくは`bigserial`列が使用するシーケンス名を取得
``pg_tablespace_databases`(`tablespace_oid`)` | `setof oid` | テーブル空間内にオブジェクトを持つデータベースのOID群を取得

`pg_get_viewdef`、`pg_get_ruledef`、`pg_get_indexdef`、`pg_get_triggerdef`、および`pg_get_constraintdef`関数はそれぞれ、ビュー、ルール、インデックス、トリガ、あるいは制約の作成コマンドを再構築します。 (これは、逆コンパイルによる再構築であって、元のコマンドテキストでないことに注意してください。) `pg_get_expr`は、列のデフォルト値など個々の式の内部形式を逆コンパイルします。 システムカタログの内容を確認する時に役に立つかもしれません。 これらのほとんどは2つの種類を持ちます。 内1つはオプションで結果を"見易く表示"することができます。 見易く表示する書式では、可読性が高まりますが、デフォルトの書式の方が今後のバージョンのPostgreSQLでも同様に解釈することができそうです。 ダンプを目的とする場合は、見易く表示する出力を使用しないでください。 見易く表示用のパラメータに`false`を渡すことで、このパラメータを全く持たない種類の結果と同一の結果を生成します。

`pg_get_userbyid()`は、与えられたユーザID番号からユーザ名を抽出します。 `pg_get_serial_sequence`は、serialまたはbigserial列に関連付いたシーケンスの名前を抽出します。 この名前はシーケンス関数（項9.12参照）に渡す際に適しています。 列にシーケンスが付与されていない場合はNULLが返されます。

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

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

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

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

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

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

前のページ | ホーム | 次のページ
集合を返す関数 | 上に戻る | システム管理関数