2011-08-10 36 views
22

當創建這樣的函數與我得到下面的錯誤非超級用戶:錯誤:權限被拒絕了C語言

ERROR: permission denied for language c SQL state: 42501

創建的函數是:

CREATE OR REPLACE FUNCTION dblink_connect (text) 
RETURNS text 
AS '$libdir/dblink','dblink_connect' 
LANGUAGE C STRICT; 

但如果我想給我的非超級用戶授予C語言權限,我會收到以下錯誤: postgres=# grant usage on language c to caixa; ERROR: language "c" is not trusted

這意味着,非超級用戶不能使用語言C創建函數嗎?還是有什麼我做錯了?

+0

也許你並不需要補助'USAGE'特權'caixa'角色明確,因爲它給予'PUBLIC'(所有角色)了。這裏的關鍵是來自'pg_language'系統目錄的'lanpltrusted'屬性。 –

回答

29

這是正確的,根據doc

​​

快速檢查:

SELECT lanpltrusted FROM pg_language WHERE lanname LIKE 'c'; 
lanpltrusted 
-------------- 
f 
(1 row) 

如果你真的想這一點,那麼你可以修改pg_language系統目錄(ALTER LANGUAGE不具備這樣的選件):

UPDATE pg_language SET lanpltrusted = true WHERE lanname LIKE 'c'; 
+0

偉大的工作。 – vchitta

+2

更新必須在正在使用的_database_中應用。我一直試圖將它應用到默認數據庫(_postgres_)。 – Otheus

13

取而代之的語言設置爲受信任被認爲,並危險, 你倒是應該使用角色時,他操縱存儲過程的時間來臨時提供超級用戶權限的用戶:

爲超級用戶:

create role dba with superuser noinherit; 
grant dba to user; 

然後登錄爲用戶可以set role dba

然後你可以創建存儲過程C,而你暫時有角色dba

reset role;當你完成恢復正常的權利。

More info here: https://dba.stackexchange.com/questions/37336/cannot-create-function-in-plpython3u-permission-denied

+3

'(no)inherit'以另一種方式工作。從文檔:*「這些子句決定一個角色是否」繼承「它是**成員的**角色的特權。」*(強調我的)也就是說,'用戶'是需要'noinherit'的那個爲了使'設置角色dba'成爲必要。在這個例子中,在'dba'角色設置'noinherit'完全沒有任何作用,因爲'dba'不是任何角色的成員。 – cdhowie