2012-07-22 15 views
10

¿Cómo hago para otorgar DML (SELECT, INSERT, UPDATE, DELETE) en todas las tablas en un esquema en PostgreSQL 8.4? También me gustaría que esta subvención persista en la creación de nuevas mesas en el futuro también.PostgreSQL 8.4 otorgar privilegios DML en todas las tablas a una función

He visto soluciones para 9.0 pero me quedo con 8.4 ya que se incluye con Debian estable.

me han tratado los siguientes como una línea de base, pero no funciona, lo que resulta en la inevitable "el acceso a la relación X negado":

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser; 

He dragado a través de la documentación y no puedo parece encontrar una solución adecuada.

+0

¿Por qué no puedes actualizar? Seguramente debe haber una forma de actualizar PostgreSQL. Las versiones actuales se pueden descargar desde el sitio web de Postgres. –

+0

Definitivamente hay formas de actualizar, pero no deseo porque los paquetes suministrados por el proveedor están bien integrados, probados y entendidos. Nuestro plan es hasta 9.1 al mismo tiempo que Debian wheezy se declara estable. – pointyhat

+0

Nunca entenderé por qué algunos sistemas operativos patrocinan mucho al usuario. –

Respuesta

21

También me gustaría que esta subvención persista para la creación de nuevas tablas en el futuro también. [...] He dragado la documentación y parece que no puedo encontrar una solución adecuada.

Porque antes del 9.0 no hay ninguno. Todo lo que puede obtener es establecer los permisos para tablas existentes. Tienes que hacer un GRANT para cada tabla, porque antes de 9.0 no había modo "bulk". Ver 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 le falta.

También: 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 elementos "contenidos" como tablas. La sección pertinente:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } 
    ON DATABASE dbname [, ...] 
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

Lo que significa que sólo se puede establecer CREATE, CONNECT y TEMP permisos en la base de datos en sí, pero no SELECT, etc. INSERT


hasta ahora para las cosas malas. Lo que puede hacer son las siguientes cosas:

  • Reducir el número de gestión de permisos mediante la concesión de 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 los comandos GRANT adecuados. Guárdelos en un archivo y ejecútelo. Esto debería darte un inicio más fácil.

una consulta de este tipo podría tener este aspecto:

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

Gracias por la respuesta, ¡eso lo explica perfectamente! – pointyhat

+0

Mucho más claro y más completo que mi respuesta, gracias. –

+0

Desafortunadamente, no otorga permisos a las secuencias, y esos permisos suelen ser útiles. – Calimo

2

Subvenciones en PostgreSQL no son recursivos; un GRANT en la base de datos establece derechos para el objeto de base de datos, pero no afecta a los esquemas contenidos o sus tablas, vistas, funciones, etc.

Concesión ALL PRIVELEGES sobre las subvenciones de bases de datos CREATE, CONNECT y TEMPORARY derechos.

Ver \h GRANT en psql o the documentation for GRANT in 8.4, para ver lo que significa ALL PRIVILEGES para DATABASE:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } 
    ON DATABASE database_name [, ...] 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

Hay funciones plpgsql y varios guiones tercero fabricantes disponibles que utilizan pg_catalog o information_schema para construir dinámicamente GRANT s y establecen de forma recursiva derechos. Busque "beca recursiva postgresql".

Esto no le ayudará a configurar los derechos de acceso predeterminados para nuevas tablas. PostgreSQL tiene ALTER DEFAULT PRIVILEGES para permitirle establecer los derechos de tabla predeterminados para tablas nuevas, pero solo se admite en Pg 9.1 y posteriores. Se requieren explícitos GRANT s para cada tabla en versiones anteriores o cuando los permisos deben establecerse después de la creación de la tabla.

Las versiones más recientes, como ha notado, tienen facilidades para múltiples concesiones a través del GRANT ... ALL TABLES, pero su pregunta es específica de 8.4.

0

Añadir todos los privilegios en todas las tablas:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username]; 
+2

no funcionará para Postgres <9 –

1

Si tiene otro usuario que tiene los privilegios DML, que funciona en PostgreSQL 8.x/9.x:

grant <userWithDMLPrivileges> to testuser; 

Espero que ayude.

Cuestiones relacionadas