Pregunta GRANT SELECT para todas las tablas en postgresql


¿Hay una sola línea que otorga el SELECT permisos a un nuevo usuario postgresql?

Algo que implementaría el siguiente pseudocódigo:

GRANT SELECT ON TABLE * TO my_new_user;

77
2017-08-30 14:11


origen




Respuestas:


Pensé que podría ser útil mencionar que, a partir de 9.0, postgres tiene la sintaxis para otorgar privilegios en todas las tablas (así como en otros objetos) en un esquema:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;

Aquí está el enlace.


131
2018-06-26 14:00



Voy a actualizar pronto, así que esta es una muy buena noticia. ¡Gracias! - Adam Matan
¿Esto afecta a todas las bases de datos en el servidor que usan el esquema público? - kristianp
Si creo una nueva tabla, ¿tendrá este usuario acceso a la tabla recién creada? - GuiSim
@GuiSim No, tienes que configurar el default privileges en un esquema, donde ytou crea la tabla: postgresql.org/docs/current/static/… - SkyRaT
@kristianp No, cada base de datos en el clúster de PG tiene su propio esquema público. Afecta a todas las tablas (funciones) en el esquema. public para la base de datos actual a la que está conectado. - SkyRaT


Mi solución (no de una sola línea):

#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done

Ejecutado desde el usuario privilegiado, funcionó a la perfección.


11
2018-06-01 06:29



Si usa pg_stat_user_tables en lugar de all_tables, no necesita su grep ... Además, pase -A -t a psql para deshacerse de la salida con formato. - Magnus Hagander
Tenga en cuenta que a partir de Postgres 9.0, el enfoque de esta respuesta lo está haciendo de la manera más difícil. En 9.x, ahora tenemos el "EN TODO" visto en esta otra respuesta. - Basil Bourque


Esto se puede hacer con un proceso de dos pasos.

  1. Ejecutar esta consulta:

    select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
    from pg_tables where schemaname in ('$bar', '$baz')
    order by schemaname, tablename;
    

    Reemplazos:

    $foo = nombre de usuario al que desea otorgar permisos
    $bar, $baz = esquemas a los que desea otorgar permisos (puede ser solo "público")

  2. Eso le dará una lista de consultas que generarán los permisos necesarios. Copie la salida, péguela en otra consulta y ejecute.


8
2017-08-05 13:25





Esto es lo que usé:

psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname

Siento que es más natural hacer el formato y las cláusulas where en sql.


2
2017-11-30 00:38





Estoy trabajando con postgres 8.4 y para otorgar todos los privilegios a un usuario, haga lo siguiente:

#!/bin/bash

for table in `echo "SELECT schemaname||'.'||relname FROM pg_stat_all_tables WHERE schemaname NOT IN('pg_catalog','pg_toast','information_schema')" | psql -t db `;
do
    echo "grant select on table $table to my_new_user;"
    echo "grant select on table $table to my_new_user;" | psql db
done

1
2018-04-05 18:04



En inglés por favor. - Linger


Una forma de solucionar esto es escribir un procedimiento almacenado. desafortunadamente no hay un comando de "otorgar todo a todas las tablas" o algo así. realmente necesitas un procedimiento o algún script de shell externo para hacer que esto funcione.


0
2017-07-03 18:20





Terminé haciendo esta, Y funcionó:

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;

0