6.13. その他の関数

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

Table 6-27. セッション情報関数

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

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

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

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

検索パスは、実行時の設定で変更することができます。 使用するコマンドは、 SET SEARCH_PATH 'schema'[,'schema']... です。

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

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

Table 6-28. 設定をセットする情報関数

名前返り値型説明
current_setting(setting_name) text (テキスト)現在の設定値
set_config(setting_name, new_value, is_local) text (テキスト)現在の設定の新規値

current_setting は、setting_name の現在の設定値を、問い合わせの結果として取得するために使用します。 この関数は、SQL での SHOW コマンドと同じです。例を示します。

select current_setting('DateStyle');
            current_setting
---------------------------------------
 ISO with US (NonEuropean) conventions
(1 row)

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

select set_config('show_statement_stats','off','f');
 set_config
------------
 off
(1 row)

Table 6-29 に、オブジェクトアクセス権限へのプログラマチックな問い合わせを可能とする関数をリストします。 権限についての詳細は、Section 2.7 を参照してください。

Table 6-29. アクセス権限照会関数

名前返り値型説明
has_table_privilege(user, table, access) boolean (論理値)テーブルにユーザーのアクセス権限があるのか
has_table_privilege(table, access) boolean (論理値)テーブルにカレントユーザーのアクセス権限があるのか
has_database_privilege(user, database, access) boolean (論理値)ユーザにデータベースへのアクセス権限があるのか
has_database_privilege(database, access) boolean (論理値)現行ユーザにデータベースへのアクセス権限があるのか
has_function_privilege(user, function, access) boolean (論理値)ユーザに関数へのアクセス権限があるのか
has_function_privilege(function, access) boolean (論理値)現行ユーザに関数へのアクセス権限があるのか
has_language_privilege(user, language, access) boolean (論理値)ユーザに言語へのアクセス権限があるのか
has_language_privilege(language, access) boolean (論理値)現行ユーザに言語へのアクセス権限があるのか
has_schema_privilege(user, schema, access) boolean (論理値)ユーザにスキーマへのアクセス権限があるのか
has_schema_privilege(schema, access) 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 で評価する必要があります。

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

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

Table 6-30. スキーマ可視性照会関数

名前返り値型説明
pg_table_is_visible(tableOID) boolean (論理値)テーブルが検索パスにおいて可視であるのか
pg_type_is_visible(typeOID) boolean (論理値)データ型が検索パスにおいて可視であるのか
pg_function_is_visible(functionOID) boolean (論理値)関数が検索パスにおいて可視であるのか
pg_operator_is_visible(operatorOID) boolean (論理値)演算子が検索パスにおいて可視であるのか
pg_opclass_is_visible(opclassOID) boolean (論理値)演算子クラスが検索パスにおいて可視であるのか

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

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

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

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

Table 6-31 に、システムカタログから情報を抽出する関数をリストします。 pg_get_viewdef()pg_get_ruledef()pg_get_indexdef()、および pg_get_constraintdef() 関数は、それぞれ、ビュー、ルール、インデックス、あるいは制約の作成コマンドを再構築します。 (これは、逆コンパイルによる再構築であって、コマンドを逐語的に並べたテキストでないことに注意してください。) 現在、pg_get_constraintdef() 関数は、外部キー制約にのみ作用します。 pg_get_userbyid() 関数は、与えられた usesysid の値からユーザ名を抽出します。

Table 6-31. カタログ情報関数

名前返り値型説明
pg_get_viewdef(viewname)text (テキスト)ビュー用 CREATE VIEW コマンドの取得 (削除)
pg_get_viewdef(viewOID)text (テキスト)ビュー用 CREATE VIEW コマンドの取得
pg_get_ruledef(ruleOID)text (テキスト)ルール用 CREATE RULE コマンドの取得
pg_get_indexdef(indexOID)text (テキスト)インデックス用 CREATE INDEX コマンドの取得
pg_get_constraintdef(constraintOID)text (テキスト)制約定義の取得
pg_get_userbyid(userid)name与えられた ID を使用するユーザ名を取得

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

Table 6-32. コメント情報関数

名前返り値型説明
obj_description(objectOID, tablename)text (テキスト)データベースオブジェクトのコメントを取得
obj_description(objectOID)text (テキスト)データベースオブジェクトのコメントを取得 (削除)
col_description(tableOID, columnnumber)text (テキスト)テーブルの列のコメントを取得

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

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