| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 9. 函數和操作符 | Fast Forward | Next |
Table 9-39 顯示了幾個抽取會話及系統訊息的函數。
Table 9-39. 會話訊息函數
| 名字 | 返回類型 | 描述 |
|---|---|---|
| current_database() | name | 目前資料庫的名字 |
| current_schema() | name | 目前模式的名字 |
| current_schemas(boolean) | name[] | 在搜索路徑中的模式名字 |
| current_user | name | 目前執行環境下的用戶名 |
| inet_client_addr() | inet | 連接的遠端址 |
| inet_client_port() | int4 | 連接的遠端連接埠 |
| inet_server_addr() | inet | 連接的本地地址 |
| inet_server_port() | int4 | 連接的本地連接埠 |
| session_user | name | 會話用戶名 |
| user | name | 等於 current_user |
| version() | text | PostgreSQL 版本訊息 |
session_user 通常是初始化目前資料庫連線的用戶, 不過超級用戶可以用 SET SESSION AUTHORIZATION 修改這個設置。 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, ...]
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 的變體,我們可以透過它們的參數數目和類型來區分它們。) 如果用名字聲明,那麼在必要時該名字可以是模式修飾的。 所希望的權限類型是用一個文本字串來聲明的,它們必須得出下面的幾個數值之一: 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 資料類型一樣(參閱 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_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-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。