¿Hay una línea que otorgue los permisos SELECCIONAR a un nuevo usuario postgresql?
Algo que implementaría el siguiente pseudocódigo:
GRANT SELECT ON TABLE * TO my_new_user;
¿Hay una línea que otorgue los permisos SELECCIONAR a un nuevo usuario postgresql?
Algo que implementaría el siguiente pseudocódigo:
GRANT SELECT ON TABLE * TO my_new_user;
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 .
default privileges
en un esquema, donde crea la tabla: postgresql.org/docs/current/static/…
public
para la base de datos actual a la que está conectado.
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.
Esto se puede hacer con un proceso de dos pasos.
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")
Eso le dará una lista de consultas que generarán los permisos necesarios. Copie el resultado, péguelo en otra consulta y ejecútelo.
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
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.
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