2011-09-07 14 views
52

¿Cómo puedo consultar todas las SUBVENCIONES concedidas a un objeto en postgres?Consultar concesiones para una tabla en postgres

Por ejemplo, tengo la mesa "mitabla":

GRANT SELECT, INSERT ON mytable TO user1 
GRANT UPDATE ON mytable TO user2 

necesito somthing que me da:

user1: SELECT, INSERT 
user2: UPDATE 

Respuesta

59

ya lo encontré:

SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable' 
71

\z mytable de psql le da todas las donaciones de una mesa, pero que había luego tiene que dividirlo por usuario individual.

+0

le ejecutar esta directamente desde el panel SQL o la línea de comandos pg? –

+1

@ DanielL.VanDenBosch: todos los metacomandos, como '\ z', son para psql. Y psql es la interfaz de línea de comandos para PostgreSQL. –

18

Si realmente quieres una línea por cada usuario, se pueden agrupar por concesionario (requiere PG9 + para string_agg)

SELECT grantee, string_agg(privilege_type, ', ') AS privileges 
FROM information_schema.role_table_grants 
WHERE table_name='mytable' 
GROUP BY grantee; 

Esta es la Salida algo como:

grantee | privileges 
---------+---------------- 
user1 | INSERT, SELECT 
user2 | UPDATE 
(2 rows) 
+1

Casi lo que quiero, ¿puedo tener los resultados exactos de 'GRANT' como pg_dump? – brauliobo

8

Pruebe la consulta a continuación. Le dará una lista de todos los usuarios y sus permisos en la tabla.

select a.tablename,b.usename,HAS_TABLE_PRIVILEGE(usename,tablename, 'select') as select, 
    HAS_TABLE_PRIVILEGE(usename,tablename, 'insert') as insert, 
    HAS_TABLE_PRIVILEGE(usename,tablename, 'update') as update, 
    HAS_TABLE_PRIVILEGE(usename,tablename, 'delete') as delete, 
    HAS_TABLE_PRIVILEGE(usename,tablename, 'references') as references from pg_tables a , pg_user b 
where a.tablename='your_table_name'; 
+1

Esta es la única respuesta aquí que calcula los permisos obtenidos de la membresía en otros roles, por lo que obtiene mi voto. Por otro lado, diría 'has_table_privilege (nombre de usuario, contacto (schemaname, '.', Tablename), ...)' para evitar la ambigüedad. –

+0

Plus One - ¡ESTO ES ORO PURO! – Daniel

0

Aquí hay una secuencia de comandos que genera consultas de concesión para una tabla en particular. Omite los privilegios del propietario.

SELECT 
    format (
     'GRANT %s ON TABLE %I.%I TO %I%s;', 
     string_agg(tg.privilege_type, ', '), 
     tg.table_schema, 
     tg.table_name, 
     tg.grantee, 
     CASE 
     WHEN tg.is_grantable = 'YES' 
     THEN ' WITH GRANT OPTION' 
     ELSE '' 
     END 
    ) 
    FROM information_schema.role_table_grants tg 
    JOIN pg_tables t ON t.schemaname = tg.table_schema AND t.tablename = tg.table_name 
    WHERE 
    tg.table_schema = 'myschema' AND 
    tg.table_name='mytable' AND 
    t.tableowner <> tg.grantee 
    GROUP BY tg.table_schema, tg.table_name, tg.grantee, tg.is_grantable; 
2

Esta consulta una lista de todas las tablas en todas las bases de datos y esquemas (elimine la línea (s) en la cláusula WHERE para filtrar específicos bases de datos, esquemas, o tablas), con los privilegios muestran en orden, así que es fácil de ver si se concede un privilegio específico o no: la salida

SELECT grantee 
     ,table_catalog 
     ,table_schema 
     ,table_name 
     ,string_agg(privilege_type, ', ' ORDER BY privilege_type) AS privileges 
FROM information_schema.role_table_grants 
WHERE grantee != 'postgres' 
-- and table_catalog = 'somedatabase' /* uncomment line to filter database */ 
-- and table_schema = 'someschema' /* uncomment line to filter schema */ 
-- and table_name = 'sometable' /* uncomment line to filter table */ 
GROUP BY 1, 2, 3, 4; 

muestra:

grantee |table_catalog |table_schema |table_name  |privileges  | 
--------|----------------|--------------|---------------|---------------| 
PUBLIC |adventure_works |pg_catalog |pg_sequence |SELECT   | 
PUBLIC |adventure_works |pg_catalog |pg_sequences |SELECT   | 
PUBLIC |adventure_works |pg_catalog |pg_settings |SELECT, UPDATE | 
... 
Cuestiones relacionadas