2011-08-10 12 views
22

Tworząc funkcję jak ten z non-super user Otrzymuję błąd poniżej:BŁĄD: brak dostępu do języka C

ERROR: permission denied for language c SQL state: 42501

Funkcja tworzony jest:

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

Ale jeśli chciałbym wyrazić zgodę na język C mojego nie-super użytkownika, otrzymuję błąd poniżej: postgres=# grant usage on language c to caixa; ERROR: language "c" is not trusted

Oznacza to, że nie-super użytkownik nie może utworzyć funkcji z językiem C? czy coś jeszcze robię źle?

+0

Prawdopodobnie nie trzeba grant 'USAGE' przywilej' roli caixa' wyraźnie, ponieważ jest przyznawana 'PUBLIC' (wszystkie role) już. Kluczem jest tutaj własność 'lanpltrusted' z katalogu systemowego' pg_language'. –

Odpowiedz

29

To prawda, według doc:

Only superusers can create functions in untrusted languages

Szybkie check:

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

Jeśli naprawdę chcesz tego, to można zmodyfikować pg_language katalogu systemowego (ALTER LANGUAGE nie ma takich opcja):

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

świetnie się udało. – vchitta

+2

Aktualizacja musi zostać zastosowana w używanej _database_. Próbowałem zastosować go do domyślnej bazy danych (_postgres_). – Otheus

13

Zamiast ustawiania języka zaufanym który jest uważany złe i niebezpieczne, należy raczej używać role, aby zapewnić przywilej administratora tymczasowo do użytkownika w czasie manipuluje procedur przechowywanych:

jako administrator :

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

następnie zalogowany jako użytkownik możesz set role dba

I wtedy można utworzyć procedury składowane C, gdy tymczasowo masz rolę dba.

reset role; po zakończeniu przywracania normalnych uprawnień.

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

+3

'(no) inherit' działa w drugą stronę. Z dokumentów: * "Te zdania określają, czy rola" dziedziczy "uprawnienia ** ról, które jest członkiem **." * (Podkreślenie moje) Oznacza to, że 'użytkownik' to taki, który potrzebuje' noinherit' w aby ustawić 'set role dba' konieczne. Ustawienie 'noinherit' na roli' dba' w tym przykładzie nic nie robi, ponieważ 'dba' nie jest członkiem żadnej z ról. – cdhowie

Powiązane problemy