¿OTORGAR USO en todos los esquemas en una base de datos?


12

Quiero a GRANT USAGEun usuario / rol para una base de datos dada. La base de datos tiene muchos esquemas.

Sé que hay un ON ALL TABLES IN SCHEMA, pero quiero "todos los esquemas". Lo intenté GRANT USAGE .. ON DATABASE, pero eso obviamente está mal (en realidad no existe ).

Esto es para Postgres 9.3 o 9.4, resulta ser un servidor que está en AWS RDS.

Respuestas:


17

Tienes al menos dos opciones.

El primero hace uso de una pequeña consulta y un editor de texto. Tenemos que recopilar los esquemas de nuestro interés:

SELECT nspname
  FROM pg_namespace;

Puede agregar una WHEREcláusula si desea limitar el alcance. Copie el resultado y modifíquelo, para obtener una serie de GRANT USAGE ON SCHEMA ... TO your_role;comandos. Luego solo alimente psql, por ejemplo:

psql -f multigrant.sql

Una variante habitual de esto podría ser un script de shell que recorra los nombres y llamadas recopilados psql, pasando la GRANTdeclaración construida a la -copción.

La otra solución hace básicamente lo mismo en un bloque pl / pgsql, construyendo una consulta dinámica. El núcleo es el mismo: tenemos que recopilar los esquemas. Luego recorremos todos ellos, otorgando el esquema de permisos por esquema:

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
    END LOOP;
END;
$do$;

Notas :

  • a diferencia de las tablas, secuencias, funciones y tipos, no se pueden establecer privilegios predeterminados para los esquemas (a partir de 9.4). Deberá otorgar este privilegio para cualquier esquema recién agregado manualmente.
  • Aquí estoy usando la cotización en dólares al construir la consulta dinámica. Esto me permite usar la sintaxis 'normal', en lugar de multiplicar comillas simples, por ejemplo (no presente en este ejemplo). De esta manera, la mayoría de los editores destacarán las declaraciones muy bien.
  • También lo uso format()con el %Iespecificador de formato para tener el nombre del objeto correctamente citado si es necesario. Este enfoque es mucho más legible que construir la consulta con concatenación de constantes de cadena y algunas quote_ident()llamadas.
  • pg_namespacese puede encontrar en el pg_catalogesquema. Echa un vistazo a los otros objetos allí: almacenan todos los aspectos de tus esquemas, tablas, etc.

1
Me pregunto si podría simular privilegios predeterminados para esquemas recién creados mediante el uso de un desencadenador de eventos que ejecuta automáticamente grant usageel nuevo esquema.
a_horse_with_no_name

@a_horse_with_no_name pensando en ello, actualmente no veo ninguna razón por la que no se pueda hacer.
dezso

0

Puedes usar también.

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I to your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.