sobre - otorgar privilegios a usuarios oracle
Forma correcta de otorgar a los usuarios acceso a esquemas adicionales en Oracle (3)
AFAIK necesita hacer el objeto de subvenciones de a uno por vez.
Normalmente, usaría un script para hacer esto, algo como:
SELECT ''GRANT ALL ON ''||table_name||'' TO BOB;''
FROM ALL_TABLES
WHERE OWNER = ''ALICE'';
Y similar para otros objetos db.
Puede poner un paquete en cada esquema que necesite 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;
Tengo dos usuarios, Bob y Alice, en Oracle, ambos creados al ejecutar los siguientes comandos como sysdba de sqlplus:
create user $blah identified by $password; grant resource, connect, create view to $blah;
Quiero que Bob tenga acceso completo al esquema de Alice (es decir, a todas las tablas), pero no estoy seguro de qué concesión ejecutar y si ejecutarla como sysdba o como Alice.
Feliz de escuchar acerca de cualquier buen puntero al material de referencia también, no parece ser capaz de obtener una buena respuesta a esto, ya sea de Internet o "Oracle Database 10g The Complete Reference", que está sentado en mi escritorio.
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 quiere planificar 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.
Otra solución si tienes un 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;