sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL 8.4 otorga privilegios DML en todas las tablas a un rol

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');