GRANT SELECT para todas las tablas en postgresql


Respuestas:


145

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 .


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

55
Si creo una nueva tabla, ¿tendrá este usuario acceso a la tabla recién creada?
GuiSim

8
@GuiSim No, debe configurarlo default privilegesen un esquema, donde crea la tabla: postgresql.org/docs/current/static/…
SkyRaT

@kristianp No, cada base de datos en el clúster PG tiene su propio esquema público. Afecta a todas las tablas (funciones) en el esquema publicpara la base de datos actual a la que está conectado.
SkyRaT

11

Mi solución (sin 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

Ejecutar desde el usuario privilegiado, funcionó a las mil maravillas.


3
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 formateada.
Magnus Hagander

1
Tenga en cuenta que a partir de Postgres 9.0, el enfoque de esta respuesta lo está haciendo de la manera difícil. En 9.x, ahora tenemos el "EN TODO" visto en esta otra respuesta .
Basil Bourque

este no funciona donde los nombres de tabla o esquema contienen letras mayúsculas. Agregar una versión modificada a continuación
anneb

9

Esto se puede hacer con un proceso de dos pasos.

  1. Ejecute 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 para el que desea otorgar permisos
    $bar, $baz= esquemas en 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 el resultado, péguelo en otra consulta y ejecútelo.


2

Esto es lo que usé:

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

Creo que es más natural hacer formato y cláusulas where en sql.


2

Terminé haciendo esto , y funcionó:

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

1

Estoy trabajando con postgres 8.4 y para dar 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
En inglés por favor.
Linger

0

Una forma de solucionar esto es escribir un procedimiento almacenado. desafortunadamente no existe el comando "conceder todo a todas las tablas" más o menos. realmente necesita un procedimiento o algún script de shell externo para que esto funcione.


0

El script (solución de una línea) de Adam Matan es excelente cuando hay muchos esquemas, pero no funciona donde los nombres de esquema o tabla contienen letras mayúsculas o caracteres especiales.

Versión modificada:

#!/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
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.