Generación de Grants
El problema era principalmente entregar acceso a un rol a tablas determinadas dentro de una base de datos, para ello cree un script que me entregara todas las cadenas grants que se requerían.
SELECT
'/*'||rpad(c.relname,35)||'*/'||
CASE c.relkind
WHEN 'r' THEN 'GRANT SELECT, INSERT, DELETE, UPDATE ON '||n.nspname||'.'||c.relname
WHEN 'v' THEN 'GRANT ALL PRIVILEGES ON '||n.nspname||'.'||c.relname
WHEN 'i' THEN '/*INDICE*/'
WHEN 'S' THEN 'GRANT ALL PRIVILEGES ON '||n.nspname||'.'||c.relname
WHEN 's' THEN '/*special*/'
END
||' TO rol0001;'
as "GRANT"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','S','v')
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1;
'/*'||rpad(c.relname,35)||'*/'||
CASE c.relkind
WHEN 'r' THEN 'GRANT SELECT, INSERT, DELETE, UPDATE ON '||n.nspname||'.'||c.relname
WHEN 'v' THEN 'GRANT ALL PRIVILEGES ON '||n.nspname||'.'||c.relname
WHEN 'i' THEN '/*INDICE*/'
WHEN 'S' THEN 'GRANT ALL PRIVILEGES ON '||n.nspname||'.'||c.relname
WHEN 's' THEN '/*special*/'
END
||' TO rol0001;'
as "GRANT"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','S','v')
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1;
Este script genera todos los grants para los objetos de tipo tabla, vista y sequence para el usuario rol0001, el resultado de este query se ejecuta y con esto se obtienen la aplicación de los permisos.
Este mismo query puede utilizarse para listar los componentes de la base de datos, por ejemplo si queremos obtener el listado de todas las tablas de la B.D, podemos usar algo parecido:
SELECT
n.nspname||'.'||c.relname as "TABLAS"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r')
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1;
No hay comentarios:
Publicar un comentario