Recientemente me he encontrado con la necesidad de tener que acceder a un schema “ajeno” desde un usuario en Oracle. El problema es que no me pasaron los scripts que otorgaban los privilegios apropiados para ello… Como se trataba de un trabajo de desarrollo y prueba en local, decidí “saltarme” las normas y entrar a lo duro en el schema ajeno.
Os explico cómo, no es demasiado difícil, y no es necesario ser sysdba para conseguirlo: el usuario propietario del schema al que se desea acceder otorga los privilegios deseados al otro usuario, símplemente. La única necesidad, y esa si es importante, es que el usuario del schema que se va a compartir, debe tener suficientes privilegios para otorgarlos.
Veamos el código (debe ejecutarlo el usuario propietario del schema que se desea compartir):
BEGIN FOR t IN (SELECT * FROM user_tables) LOOP EXECUTE IMMEDIATE 'GRANT SELECT ON ' || t.table_name || ' TO DEST_USER'; END LOOP; END;
Rápidamente, lo que este código hace es, mediante un bucle, recorre todas las tablas del usuario que comparte el schema y otorga los privilegios seleccionados (en este caso solo SELECT) a cada tabla para el usuario DEST_USER (sustituir por el nombre del usuario al que deseamos otorgar los permisos).
Y esto es todo.
Espero haberos sido de ayuda.
Jordi
Y donde indico el esquema?
Necesito otorga ese permiso sólo a tablas de 1 esquema específico
Como se hace?
Hola Marcos.
El esquema es el del usuario que ejecuta el script. Por jemplo, el usuario A está asociado al esquema S, y ejecuta el script sobre el usuario B, por lo tanto, el usaurio B obtiene privilegios sobre las tablas del esquema S. Si dispone de mas de un esquema, no lo he probado, pero debería otorgarlos de igual modo a todos ellos. De ahí que no sea necesario ser SYSDBA, sino un usuario corriente, pero con suficientes privilegios para GRANT.
Espero haberte ayudado.
I truly appreciate this post. I’ve been looking all over for this! Thank goodness I found it on Bing. You’ve made my day! Thanks again! eegffdefdgdd
Thank you very much for your feedback, dear.
Best regards from Barcelona.
excelente el tutorial
No funciona.
mejorado:
declare
cursor c1 is select table_name from dba_tables where owner=’MWS’;
cmd varchar2(200);
begin
for c in c1 loop
cmd := ‘GRANT SELECT ON MWS.’ || c.table_name || ‘ TO VWARYER’;
execute immediate cmd;
end loop;
end;
Muchas gracias!!!
Impecable. Gracias!
Gracias por tu feedback, amigo Diego.
Un saludo!
Hola Jordi, tu post me fue de mucha utilidad, muchas gracias. Funcionó perfectamente el script.
Hola Benina,
Muchas gracias por tu feedback, me alegro haber sido de ayuda!
Un saludo!
Jordi