Oracle: otorgar permisos a un usuario sobre un schema específico

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

Share Button

11 comentarios

    • 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.

  1. 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;

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.