Hemos estado en ocasiones, que perdemos los permisos de los objetos, debido a un import de otra Base de Datos u algo similar.
Supongamos que te piden hacer un export de una BD1 (con permisos de un ambiente de Producción), luego importarlos a BD2 (con permisos de un ambiente de Desarrollo). Para no complicarte la vida jugando con los parámetros de la utilería EXP o IMP, te proponemos un método sencillo.
Siguiendo con este mismo ejemplo, antes de hacer el import a Desarrollo ejecuta el siguiente script (en tu bd de Desarrollo):
spool otorga_permisos_despues_de_refresh.sql
set heading off
set linesi 220
select 'grant ' || granted_role || ' to ' || grantee || ';' from dba_role_privs
where grantee not in ('SYS','SYSTEM','XDB') and admin_option ='NO'
union
select 'grant ' || granted_role || ' to ' || grantee || ' with admin option;' from dba_role_privs
where grantee not in ('SYS','SYSTEM','XDB') and admin_option ='YES'
union
select 'grant ' || privilege || ' to ' || grantee || ';' from dba_sys_privs
where grantee not in ('SYS','SYSTEM','XDB') and admin_option ='NO'
union
select 'grant ' || privilege || ' to ' || grantee || ' with admin option;' from dba_sys_privs
where grantee not in ('SYS','SYSTEM','XDB') and admin_option ='YES'
union
select 'grant ' || privilege || ' on ' || OWNER || '.' || TABLE_NAME || ' to ' || grantee || ';'
from dba_tab_privs
where grantee not in ('SYS','SYSTEM','XDB')
/
spool off
Esto te dejará un script llamado "otorga_permisos_despues_de_refresh" (proveniente del spool). Lo que tendrá dentro, son todos los permisos existentes antes de tu import. Así que solamente te queda ejecutarlo después de la carga de datos, para regresar los permisos a como estaban antes del "refresh".
Saludos
{mosimage}
Carlos Contreras
Oracle Certified DBA