2011-08-10 26 views
22

非スーパーユーザーでこのような関数を作成するときに、私は以下のエラーが取得しています:ERROR:許可言語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以外のユーザーにC言語の許可を与えたい場合、以下のエラーが表示されます。 postgres=# grant usage on language c to caixa; ERROR: language "c" is not trusted

つまり、スーパーユーザーでないユーザーは言語Cの関数を作成できません。それとも私が間違っている何か他に何かありますか?

+0

それはすでに 'PUBLIC'(すべてのロール)に付与されているため、おそらくあなたは、明示的caixa'の役割'に付与 'USAGE'権限を必要としません。ここでの鍵は 'pg_language'システムカタログの' lanpltrusted'プロパティです。 –

答えて

29

docによると、そうです:

​​

クイックチェック:

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

あなた本当には(ALTER LANGUAGEがこのようなを持っていない、あなたはpg_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'は逆の働きをします。ドキュメントから:* "これらの句は、ロールが**ロールの特権を継承するかどうかを判断します**" *(emphasis mine)つまり、 'user'は' noinherit'を必要とするものです'set role dba'を必要とするようにしてください。この例の 'dba'ロールに' noinherit'を設定すると、まったく何も行いません。なぜなら 'dba'はどのロールのメンバーでもないからです。 – cdhowie

関連する問題