9.19. 系統訊息函數

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

Table 9-39. 會話訊息函數

名字返回類型描述
current_database()name目前資料庫的名字
current_schema()name目前模式的名字
current_schemas(boolean)name[]在搜索路徑中的模式名字
current_username目前執行環境下的用戶名
inet_client_addr()inet連接的遠端址
inet_client_port()int4連接的遠端連接埠
inet_server_addr()inet連接的本地地址
inet_server_port()int4連接的本地連接埠
session_username會話用戶名
username等於 current_user
version()textPostgreSQL 版本訊息

session_user 通常是初始化目前資料庫連線的用戶, 不過超級用戶可以用 SET SESSION AUTHORIZATION 修改這個設置。 current_user 是用於權限檢查的用戶標識。通常, 它總是等於會話用戶,但是在將來可能有 "setuid" 函數和其他它是等於會話用戶, 但是它在函數執行的過程中隨著屬性 SECURITY DEFINER 的改變而改變。 在 Unix 的說法裡,那麼會話用戶是"真實用戶",而目前用戶是"有效用戶"

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

current_schema 返回在搜索路徑前面的模式名字 (如果搜索路徑是空則返回 NULL)。 如果建立資料表或者其它命名對像時沒有聲明目標模式,那麼它將是用於這些對象的模式。 current_schemas(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伺服器的版本的字串。

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

Table 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 的變體,我們可以透過它們的參數數目和類型來區分它們。) 如果用名字聲明,那麼在必要時該名字可以是模式修飾的。 所希望的權限類型是用一個文本字串來聲明的,它們必須得出下面的幾個數值之一: 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 資料類型一樣(參閱 Section 8.12)。目前可得的訪問權限類型必須得出 EXECUTE。 一個例子:

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

has_language_privilege 檢查一個用戶是否可以以某種特定的方式訪問一個過程語言。 其可能參數類似 has_table_privilege。 可用的訪問權限類型必須得出 USAGE

has_tablespace_privilege 檢查一個用戶是否可以以特定方式訪問一個資料表空間。 其可能參數類似 has_table_privilege。用戶需要的訪問權限必須計算得出 CREATE

has_schema_privilege 檢查一個用戶是否 可以以某種特定的方式訪問一個模式。其可能的參數類似 has_table_privilege。 目前可得的訪問權限類型必須得出 CREATE 或者 USAGE

要評估一個用戶是否在權限上持有賦權選項,給權限鍵字附加 WITH GRANT OPTION;比如 'UPDATE WITH GRANT OPTION'

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

SELECT relname from pg_class WHERE pg_table_is_visible(oid);

Table 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_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-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 不為零,則是只獲取一個索引字串的定義
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 的用戶名
pg_get_serial_sequence(table_name, column_name)text獲取一個 serial 或者 bigserial 字串使用的序列名字
pg_tablespace_databases(tablespace_oid)setof oid獲取在指定資料表空間(OID資料表示)中擁有對象的一套資料庫的 OID 的集合

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

pg_get_userbyid 抽取給出的一個用戶 ID 號對應的用戶名。 pg_get_serial_sequence 抓取與 serial 或者 bigserial 字串相關聯的序列名字。 這個名字經過了合適的格式化,可以傳遞給序列函數(參閱 Section 9.12)。 如果字串沒有附著序列,那麼返回 NULL。

pg_tablespace_databases 允許我們檢查一個資料表空間的使用狀況。 它講返回一套資料庫的 OID 集合,這些資料庫都是在該資料表空間中保存有對象的資料庫。 如果這個函數返回資料行,那麼它就是非空的,因此不能刪除。要顯示填充了該資料表空間的特定對象, 您需要把 pg_tablespace_databases 標出的資料庫標識與 pg_class 資料表連接進行查詢。

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

Table 9-43. 註釋訊息函數

名字返回類型描述
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。