| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 9. 函數和操作符 | Fast Forward | Next |
Table 9-35 顯示了 幾個抽取會話及系統信息的函數。
Table 9-35. 會話信息函數
| 名字 | 返回類型 | 描述 |
|---|---|---|
| current_database() | name | 當前數據庫的名字 |
| current_schema() | name | 當前模式的名字 |
| current_schemas(boolean) | name[] | 在搜索路徑中的模式名字 |
| current_user | name | 目前執行環境下的用戶名 |
| session_user | name | 會話用戶名 |
| user | name | 等于 current_user |
| version() | text | PostgreSQL 版本信息 |
session_user 是初始化數據庫聯接的用戶,在該次聯接過程 中固定. current_user 是用于權限檢查的用戶標識.通常, 它總是等于會話用戶,但是在將來可能有 "setuid" 函數和其他 它是等于會話用戶,但是它在函數執行的過程中隨著屬性 SECURITY DEFINER 的改變而改變. 在 Unix 的說法裡,那麼會話用戶是"真實用戶" 而當前用戶是"有效用戶".
注意: current_user,session_user, 和 user 在 SQL裡有特殊的語意狀態︰ 調用時結尾不要跟著園括號.
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 的變體,我們可以通過它們的參數數目 和類型來區分它們.) 如果用名字聲明,那麼在必要時該名字可以是模式修飾的. 所希望的權限類型是用一個文本字串來聲明的,它們必須得出下面的幾個 數值之一︰ 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 數據類型一樣。當前可得的訪問權限類型必須得出 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_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);請注意用這種方法測試一個未經修飾的名字沒什麼意義 --- 如果一個名字可以被識別, 那它首先得是可見的。
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.