2008-10-13 17 views
13

Tengo dos usuarios Bob y Alice en Oracle, ambos creados mediante la ejecución de los siguientes comandos como sysdba de sqlplus:Forma correcta de dar a los usuarios el acceso a los esquemas adicionales en Oracle

 
    create user $blah identified by $password; 
    grant resource, connect, create view to $blah; 

quiero Bob para tener un acceso completo al esquema de Alicia (es decir, a todas las tablas), pero no estoy seguro de qué concesión ejecutar y si ejecutarla como sysdba o como Alicia.

Feliz de escuchar sobre cualquier buen puntero al material de referencia, no parece ser capaz de obtener una buena respuesta a esto desde Internet o "Oracle Database 10g The Complete Reference", que está sentado en mi escritorio.

Respuesta

20

AFAIK necesita hacer el objeto de subvenciones de a uno por vez.

lo general tendrá que utilizar un script para hacer esto, algo a lo largo de las líneas de:

SELECT 'GRANT ALL ON '||table_name||' TO BOB;' 
FROM ALL_TABLES 
WHERE OWNER = 'ALICE'; 

Y similar para otros objetos db.

Puedes poner un paquete en cada esquema que necesites para emitir el subsidio desde el cual pasará por todas las llamadas de cada declaración de GRANT a través de un EJECUTAR INMEDIATO.

p. Ej.

PROCEDURE GRANT_TABLES 
    IS 
    BEGIN 

     FOR tab IN (SELECT table_name 
        FROM all_tables 
        WHERE owner = this_user) LOOP 
     EXECUTE IMMEDIATE 'GRANT SELECT, INSERT, UPDATE, DELETE ON '||tab.table_name||' TO other_user'; 
     END LOOP; 
    END; 
7

Hay muchas cosas a considerar. Cuando dices acceso, ¿prefieres las tablas con el nombre de otros usuarios? Puede usar sinónimos públicos para que pueda ocultar el propietario original, si eso es un problema. Y luego conceda privilegios en el sinónimo.

También desea planificar con anticipación lo mejor que pueda. Más tarde, ¿querrá que Frank también pueda acceder al esquema de Alice? No desea tener que volver a otorgar privilegios en N número de tablas. Usar una función de base de datos sería una mejor solución. Otorgue la selección a la función "ALICE_TABLES", por ejemplo, y cuando otro usuario necesite acceso, solo otorgue privilegios a la función. Esto ayuda a organizar las subvenciones que hace dentro de la base de datos.

6

Otra solución si tiene dueño diferente:

BEGIN 

    FOR x IN (SELECT owner||'.'||table_name ownertab 
      FROM all_tables 
      WHERE owner IN ('A', 'B', 'C', 'D')) 
    LOOP 
    EXECUTE IMMEDIATE 'GRANT SELECT ON '||x.ownertab||' TO other_user'; 
    END LOOP; 
END; 
Cuestiones relacionadas