2011-08-10 16 views
22

Al crear una función como esta con un usuario que no sea súper estoy consiguiendo el error a continuación:ERROR: ha denegado el permiso para el lenguaje C

ERROR: permission denied for language c SQL state: 42501

La función creada es:

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

Pero si quería dar permiso en el lenguaje C a mi usuario no súper, recibo el siguiente error: postgres=# grant usage on language c to caixa; ERROR: language "c" is not trusted

Eso significa que el usuario no súper no puede crear funciones con el lenguaje C? o hay algo más que estoy haciendo mal?

+0

Probablemente no es necesario subvención '' USAGE' privilegio de papel caixa' explícitamente, porque se concedió a 'PUBLIC' (todos los papeles) ya. La clave aquí es la propiedad 'lanpltrusted' del catálogo del sistema' pg_language'. –

Respuesta

29

Así es, de acuerdo con doc:

Only superusers can create functions in untrusted languages

comprobación rápida:

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

Si realmente desea esto, entonces se podría modificar pg_language catálogo del sistema (ALTER LANGUAGE no tiene tales opción):

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

genial funcionó. – vchitta

+2

La actualización debe aplicarse dentro de _database_ que se está utilizando. Seguí intentando aplicarlo a la base de datos predeterminada (_postgres_). – Otheus

13

En lugar de establecer el idioma a trusted que se considera mal, y peligrosa, debe más bien utilizar los roles para proporcionar privilegios de superusuario temporalmente al usuario durante el tiempo que manipula los procedimientos almacenados:

como superusuario :

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

entonces iniciado una sesión como usuario Puede set role dba

Y entonces se podría crear procedimientos almacenados en C mientras tiene temporalmente el rol dba.

reset role; cuando haya terminado para volver a los derechos normales.

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

+3

'(no) inherit' funciona en el otro sentido. De los documentos: * "Estas cláusulas determinan si un rol" hereda "los privilegios de ** roles de los que es miembro **." * (Énfasis mío) Es decir, 'usuario' es el que necesita' noinherit' en para hacer 'set role dba' necesario. Establecer 'noinherit' en el rol' dba' en este ejemplo no hace exactamente nada, ya que 'dba' no es miembro de ningún rol. – cdhowie