También me gustaría que esta subvención persistiera para la creación de nuevas tablas en el futuro.[...] He revisado la documentación y parece que no puedo encontrar una solución adecuada.
Porque antes de la 9.0 no hay ninguna. Todo lo que puede obtener es establecer los permisos para existentes mesas. Tienes que hacer una GRANT
para cada tabla, porque antes de la 9.0 no había un modo "en masa". Consulte la gramática SQL para 8.4 y 9.0:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] tablename [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
y 9.0 aquí:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
El nuevo ALL TABLES IN SCHEMA
parte es la que te falta.
Además:establecer permisos en el nivel de la base de datos como en su pregunta no lo ayudará:"solo" establecerá los permisos en la base de datos, pero no en ningún elemento "contenido" como las tablas. La sección correspondiente:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE dbname [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Lo que significa que solo puede configurar CREATE
, CONNECT
y TEMP
permisos en la propia base de datos pero no SELECT
, INSERT
etc.
Hasta ahora por las cosas malas. Lo que puedes hacer son las siguientes cosas:
-
Reduzca la cantidad de administración de permisos otorgando derechos no a los usuarios sino a los roles. Luego agregue roles a usuarios individuales. Cuando se crea una nueva tabla, solo necesita ajustar uno o dos roles, pero no cientos de usuarios.
-
Consulta los catálogos del sistema y crea
GRANT
apropiados comandos Guárdelos en un archivo y ejecute ese archivo. Esto debería darle un inicio más fácil.
Tal consulta podría verse así:
select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;'
from information_schema.tables
where
table_type = 'BASE TABLE' and
table_schema not in ('pg_catalog', 'information_schema');