2010-10-07 77 views
1

我有一個基於MapServer的Web應用程序,它使用PostGIS作爲基礎的數據庫擴展。現在我想擁有一個用於MapServer的專用數據庫角色,因爲我不想通過postgres超級用戶訪問數據庫。該角色應該只對公用表具有SELECT權限(這很容易實現)和公共PostGIS函數的EXECUTE權限。授予許多PostGIS函數的執行

出現了幾個問題:所有PostGIS相關函數是否存儲在數據庫的公共模式中,還是還有其他要考慮的事項?

我怎樣才能提取所有功能的信息 - 的論點,即函數的名稱,數量和名稱 - 從INFORMATION_SCHEMA或數據庫的pg_catalog?我需要GRAN EXECUTE對MapServerUser語句的函數(args)的信息!

謝謝!

回答

1

在PostgreSQL 8.4.x:

SELECT n.nspname as "Schema", 
    p.proname as "Name", 
    pg_catalog.pg_get_function_result(p.oid) as "Result data type", 
    pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types", 
CASE 
    WHEN p.proisagg THEN 'agg' 
    WHEN p.proiswindow THEN 'window' 
    WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger' 
    ELSE 'normal' 
END as "Type" 
FROM pg_catalog.pg_proc p 
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace 
WHERE pg_catalog.pg_function_is_visible(p.oid) 
    AND n.nspname <> 'pg_catalog' 
    AND n.nspname <> 'information_schema' 
ORDER BY 1, 2, 4; 

通過與-E參數(顯示隱藏的查詢),然後運行\ df命令運行PSQL實測值。

另外,PostgreSQL中的「公共」模式就是這樣命名的。它沒有特別的意義。這是一個糟糕的名字。你需要注意的是「公共」角色(全部大寫)。雖然表格不會自動授予PUBLIC角色,但我的經驗是,PUBLIC自動獲得對使用SECURITY INVOKER定義的函數的執行權限。

+0

我差點忘了:那個查詢只顯示用戶定義的函數。如果您需要內部函數,則需要刪除WHERE子句的「AND n.nspname <>'pg_catalog'」部分。 – 2010-10-07 14:36:05

+0

謝謝,這似乎接近我想要的。因爲我使用的是PostgreSQL 8.2.9,所以我沒有函數pg_get_fuction_result(oid)和pg_get_function_arguments(oid),所以也許你知道等價的8.2。功能?我找了他們,但找不到他們。此外,列proiswindow不存在。 – 2010-10-07 14:51:30

+0

在命令行運行此命令:「psql -E」。然後發出psql命令「\ df」。這將打印使用它來輸出的功能列表(參數和返回類型)查詢。這應該適用於PostgreSQL的所有版本。 – 2010-10-07 17:34:36