jueves, 12 de abril de 2012

S.Q.L. - PostgreSQL

Desde hace bastante tiempo llevo desarrollando aplicaciones sobre esta plataforma (PostgreSQL) y como es de esperarse he tenido que utilizar algunos tips para cumplir con mi objetivo. 

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;

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