Hoy vamos a ver como transportar roles de bases de datos.
Los roles de bases de datos son una solución cómoda y rápida para la asignación de grupos de permisos entre usuarios, el principal problema de los mismos, es que los permisos que asignas a los roles no están en las especificaciones de los usuarios que los poseen, sino que están dentro del esquema SYS dela base de datos, lo que provoca que cuando intentas importar algún esquema de usuario que posee un rol falle si no está el rol previamente definido.
Otra de las incomodidades de los roles es que , no hay una consulta sencilla que puedas hacer a la base de datos que te muestre la sintaxsis SQL del rol, con lo que su uso se convierte en algo engorroso en operaciones de movimiento de datos entre entornos.
Así pues, si queremos trabajar con roles tendremos que tener algún tipo de mecanismo para obtener los comandos de creacion de los roles.
Para esto, oracle tiene el paquete dbms_metadata que con la llamada get_ddl es capaz de obtener el código SQL para un determinado objeto.
Ahora bien,¿como llamamos a este paquete?
Para cada uno de nuestros roles tendremos que obtener las DDL de :
- creacion del rol
- Grants del rol
- Grants de system
- Grants de objetos
Así pues, para obtener los datos del rol «MIROL» haríamos:
set linesize 200
set head off
set pages 0
set long 9999999
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true);
SELECT 'create role MIROL' from dual;
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true);
SELECT dbms_metadata.get_granted_ddl('ROLE_GRANT', 'MIROL') FROM dual;
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true);
SELECT dbms_metadata.get_granted_ddl('SYSTEM_GRANT','MIROL') FROM dual;
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true);
SELECT dbms_metadata.get_granted_ddl('OBJECT_GRANT','MIROL') FROM dual;
Hay que tener en cuenta que, la consulta de los SYSTEM_GRANT es muy pesada, especialmente en sistemas con un alto número de objetos.
Por otra parte,tampoco estamos hablando de una operacion que no hemos de hacer muy amenudo y que, probablemente podamos guardar de una vez a otra