9.13. その他の関数

表9-35に、セッションおよびシステムの情報を取り出す関数をいくつか示します。

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

名前返り値型説明
current_database()name現在のデータベース名
current_schema()name現在のスキーマ名
current_schemas(boolean)name[]オプションで暗黙的スキーマを含む、検索パス内のスキーマ名
current_username現在の実行コンテキストのユーザ名
session_usernameセッションユーザ名
usernamecurrent_userと同じ
version()textPostgreSQLのバージョン情報

session_userとはデータベース接続を開始したユーザのことで、その接続が持続している間は固定されています。 current_userとは権限のチェックに使われるユーザ識別子です。 通常はセッションユーザと同じですが、SECURITY DEFINER属性が付いた関数を実行している間に異なるユーザになります。 Unix特有な語法でいうと、セッションユーザは"実ユーザ"で、カレントユーザは"実効ユーザ"です。

注意: current_usersession_user、およびuser関数は、後ろに丸括弧を付けずに呼び出さなければならないというSQLで特殊な構文上の資格を所有していることに注意してください。

current_schema関数は、検索パスの先頭にあるスキーマ名(もしくは、検索パスが空の場合はNULL値)を返します。 これは、対象スキーマを指定せずに作成された、任意のテーブルまたは他の名前付きオブジェクトに使用されるスキーマです。 また、current_schemas(boolean) は、検索パスに存在するすべてのスキーマ名の配列を返します。 booleanオプションにより、pg_catalogのような暗黙的に含まれているシステムスキーマを、検索パスに含めて返すかどうかを指定します。

注意: 検索パスは、実行時の設定で変更することができます。 使用するコマンドは以下のとおりです。

SET search_path TO schema [, schema, ...]

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

表9-36に、実行時設定パラメータの問い合わせや変更に使用できる関数を示します。

表 9-36. パラメータを設定する関数

名前返り値型説明
current_setting(setting_name) text現在の設定値
set_config(setting_name, new_value, is_local) textパラメータを設定し、その新規値を返す

current_settingは、setting_nameの現在の設定値を返します。 この関数は、SQLSHOWコマンドと同じです。 以下に例を示します。

SELECT current_setting('datestyle');

 current_setting
-----------------
 ISO, MDY
(1 row)

set_config関数により、setting_nameの設定をnew_valueに変更することができます。 ただし、is_localtrueに設定されている場合、新規値は現在のトランザクションにのみ適用されます。 新規値を現在のセッションに適用する場合は、代わりにfalseを使用してください。 この関数は、SQLのSETコマンドと同じです。 以下に例を示します。

SELECT set_config('log_statement_stats', 'off', false);

 set_config
------------
 off
(1 row)

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

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

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

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

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

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

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

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

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

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

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

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

名前返り値型説明
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_visiblepg_function_is_visiblepg_operator_is_visiblepg_opclass_is_visibleおよびpg_conversion_is_visible関数により、それぞれデータ型(およびドメイン)、関数、演算子、演算子クラス、および、変換に対する同様の可視性検査を行ないます。 関数および演算子の場合、検索パスのそれ以前の箇所に、同じ名前および引数データ型のオブジェクトがなければ、そのパス内でオブジェクトは可視です。 演算子クラスの場合、名前および関連付けられているインデックスアクセスメソッドの両方が考慮されます。

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

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

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

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

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

名前返り値型説明
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を持つユーザ名を取得

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

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

名前返り値型説明
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を所有していませんので、テーブル列に対して使用することはできません。