A la hora de crear una función como esta, con un no-super usuario me estoy haciendo el siguiente error:

ERROR: permission denied for language c
SQL state: 42501

La función 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 lenguaje C para mi no super usuario, obtengo el siguiente error:
postgres=# grant usage on language c to caixa;
ERROR: language "c" is not trusted

Que significa, no super usuario no puede crear una función con el lenguaje C? o es que hay algo que estoy haciendo mal?

  • Probablemente usted no necesita subvención USAGE privilegio caixa papel de forma explícita, porque se le concede a PUBLIC (todas las funciones) ya. La clave aquí es lanpltrusted propiedad de pg_language catálogo del sistema.
InformationsquelleAutor vchitta | 2011-08-10

2 Comentarios

  1. 34

    Que es correcto, de acuerdo a doc:

    Sólo los superusuarios pueden crear funciones en distintos idiomas

    Comprobación rápida:

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

    Si realmente quiero esto, entonces usted podría modificar pg_language catálogo del sistema (MODIFICAR el IDIOMA no tiene esa opción):

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

    Por usuario @Otheus a continuación: la ACTUALIZACIÓN de la declaración deberá realizarse en el DB, donde la función va a residir.

    • gran funcionó.
    • La actualización debe aplicarse dentro de los base de datos que se utiliza. Yo seguía tratando de aplicar a la base de datos predeterminada (postgres).
  2. 15

    En lugar de ajustar el idioma de confianza que se considera mal, y peligroso,
    usted debe utilizar las funciones para proporcionar privilegios de superusuario temporalmente para el usuario durante el tiempo que manipula los procedimientos almacenados:

    como superusuario:

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

    a continuación, iniciar una sesión como usuario usted puede set role dba

    Y, a continuación, usted podría crear procedimientos almacenados en C, mientras que temporalmente tienen la función dba.

    reset role; cuando haya terminado para volver a la normalidad de los derechos.

    Más info aquí: https://dba.stackexchange.com/questions/37336/cannot-create-function-in-plpython3u-permission-denied

    • (no)inherit funciona de otra manera. A partir de la documentación: «Estas cláusulas determinar si una función «hereda» los privilegios de funciones es un miembro de (el énfasis es mío) Que es, user es el que necesita noinherit con el fin de hacer set role dba necesario. Configuración de noinherit en el dba papel en este ejemplo hace exactamente nada, ya que dba no es un miembro de cualquiera de los roles.

Dejar respuesta

Please enter your comment!
Please enter your name here