9.13. 雜項函數

Table 9-35 顯示了 幾個抽取會話及系統信息的函數。

Table 9-35. 會話信息函數

名字返回類型描述
current_database()name當前數據庫的名字
current_schema()name當前模式的名字
current_schemas(boolean)name[]在搜索路徑中的模式名字
current_username目前執行環境下的用戶名
session_username會話用戶名
username等于 current_user
version()textPostgreSQL 版本信息

session_user 是初始化數據庫聯接的用戶,在該次聯接過程 中固定. current_user 是用于權限檢查的用戶標識.通常, 它總是等于會話用戶,但是在將來可能有 "setuid" 函數和其他 它是等于會話用戶,但是它在函數執行的過程中隨著屬性 SECURITY DEFINER 的改變而改變. 在 Unix 的說法裡,那麼會話用戶是"真實用戶" 而當前用戶是"有效用戶"

注意: current_usersession_user, 和 userSQL裡有特殊的語意狀態︰ 調用時結尾不要跟著園括號.

current_schema 返回在搜索路徑前面的模式名字 (如果搜索路徑是空則返回 NULL).如果創建表或者其它命名對象時 沒有聲明目標模式,那麼它將是用于這些對象的模式. current_schemas(boolean) 返回一個在搜索路徑中出現的 所有模式的名字的數組。布爾選項決定象pg_catalog這樣的隱含地包含 地系統模式是否包含在返回地搜索路徑中。

注意: 搜索路徑可以通過運行時設置更改。所用的命令是:

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

version() 返回一個描述 PostgreSQL服務器的版本的字串.

Table 9-36 顯示可用的查詢 以及變更運行時配置參數的函數。

Table 9-36. 配置設置函數

名字返回類型描述
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, MDY
(1 row)

set_config 將參數 setting_name 設置為 new_value。如果 is_local 設置為 true,那麼新數值將只應用于當前事務。 如果你希望新的數值應用于當前會話,那麼應該使用 false。 它等效于 SQL 命令 SET。比如:

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

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

Table 9-37 列出那些 允許用戶在程序裡查詢對象訪問權限的函數。 參閱 Section 5.7 獲取更多有關權限的信息。

Table 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 的變體,我們可以通過它們的參數數目 和類型來區分它們.) 如果用名字聲明,那麼在必要時該名字可以是模式修飾的. 所希望的權限類型是用一個文本字串來聲明的,它們必須得出下面的幾個 數值之一︰ 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'

Table 9-38 顯示了那些判斷 一個對象是否在當前模式搜索路徑中可見的函數。 如果一個表所在的模式在搜索路徑中,並且沒有同名的表出現在 搜索路徑的更早的地方,那麼就說這個表視可見的。它等效于表 可以不帶明確模式修飾進行引用。比如,要列出所有可見表的 的名字:

SELECT relname from pg_class WHERE pg_table_is_visible(oid);

Table 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);

請注意用這種方法測試一個未經修飾的名字沒什麼意義 --- 如果一個名字可以被識別, 那它首先得是可見的。

Table 9-39列出了從系統表中抽取信息的函數. pg_get_viewdef()pg_get_ruledef()pg_get_indexdef()pg_get_triggerdef,和pg_get_constraintdef() 分別從一個視圖,規則,索引,觸發器或者約束 上重新構造創建它們的命令.(請注意這裡是一個反編譯的重新構造, 而不是該命令的原文.) 這些大多數都有兩個變種,其中一個可以選擇對結果的"漂亮的打印"。 漂亮打印的格式更容易讀,但是缺省的格式更有可能被將來的 PostgreSQL 版本用同樣的方法解釋;如果是用于轉儲,那麼盡可能避免使用漂亮打印。 給漂亮打印參數傳遞 false 生成的結果和那個沒有這個參數的 變種生成的結果完全一樣。pg_get_expr 反編譯一個獨立的表達式 的內部形式,比如一個字段的缺省值。在檢查系統表的內容的時候可能有用。 pg_get_userbyid 抽取給出 的一個用戶 ID 號對應的用戶名.

Table 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 不為零,則是只獲取一個索引字段的定義
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反編譯一個表達式的內部形式,假設其中的任何 Vars 都引用第二個參數指出的關系
pg_get_expr(expr_text, relation_oid, pretty_bool)text反編譯一個表達式的內部形式,假設其中的任何 Vars 都引用第二個參數指出的關系
pg_get_userbyid(userid)name獲取給出的 ID 的用戶名

Table 9-40 顯示的函數 將原來用 COMMENT 命令存儲的評注抽取出來. 如果沒有找到匹配聲明的參數的評注,則返回 NULL

Table 9-40. 注釋信息函數

名字返回類型描述
obj_description(object_oid, catalog_name)text獲取一個數據庫對象的評注
obj_description(object_oid)text獲取一個數據庫對象的評注(廢棄)
col_description(table_oid, column_number)text獲取一個表字段的評注

兩個參數形式的 obj_description 返回一個數據庫 對象的評注,該對象是通過其 OID 和其包含系統表的名字聲明的. 比如,obj_description(123456,'pg_class') 將返回 OID 為 12345 的表的評注.一個參數的 obj_description 只要求對象 OID.它現在已經廢棄了,因為我們不再保證 OID 在不同的 系統表之間是唯一的;因此可能會返回錯誤的評注.

col_description 返回一個表的字段的評注, 它是通過它的表和字段號的 OID 來聲明的. 我們不能將 obj_description 用于表字段, 因為字段沒有自己的 OID.