2011-09-21 151 views

Respuesta

40

Un usuario en una base de datos Oracle solo tiene los privilegios que usted concede. Entonces puede crear un usuario de solo lectura simplemente no otorgando ningún otro privilegio.

Cuando se crea un usuario

CREATE USER ro_user 
IDENTIFIED BY ro_user 
DEFAULT TABLESPACE users 
TEMPORARY TABLESPACE temp; 

el usuario ni siquiera tiene permiso para conectarse a la base de datos. Puede otorgarle

GRANT CREATE SESSION to ro_user 

y luego puede otorgar los privilegios de lectura que desee. Por ejemplo, si desea RO_USER ser capaz de consultar SCHEMA_NAME.TABLE_NAME, que haría algo como

GRANT SELECT ON schema_name.table_name TO ro_user 

En general, es mejor crear un papel, sin embargo, y la concesión de los privilegios de objeto para el papel de modo que usted puede otorgar el rol a diferentes usuarios. Algo así como

Crear el papel

CREATE ROLE ro_role; 

Grant el rol de acceso SELECT en cada mesa en un esquema concreto

BEGIN 
    FOR x IN (SELECT * FROM dba_tables WHERE owner='SCHEMA_NAME') 
    LOOP 
    EXECUTE IMMEDIATE 'GRANT SELECT ON schema_name.' || x.table_name || 
            ' TO ro_role'; 
    END LOOP; 
END; 

y conceda la función al usuario

GRANT ro_role TO ro_user; 
8
create user ro_role identified by ro_role; 
grant create session, select any table, select any dictionary to ro_role; 
-1

Es n ot estrictamente posible en db predeterminado debido a los muchos ejecutables públicos que cada usuario gana automáticamente a través del público.

1

Ejecute el siguiente procedimiento, por ejemplo, como sistema de usuario.

Establezca p_owner en el propietario del esquema y p_readonly en el nombre del usuario de solo lectura.

create or replace 
procedure createReadOnlyUser(p_owner in varchar2, p_readonly in varchar2) 
AUTHID CURRENT_USER is 
BEGIN 
    execute immediate 'create user '||p_readonly||' identified by '||p_readonly; 
    execute immediate 'grant create session to '||p_readonly; 
    execute immediate 'grant select any dictionary to '||p_readonly; 
    execute immediate 'grant create synonym to '||p_readonly; 

    FOR R IN (SELECT owner, object_name from all_objects where object_type in('TABLE', 'VIEW') and owner=p_owner) LOOP 
     execute immediate 'grant select on '||p_owner||'.'||R.object_name||' to '||p_readonly; 
    END LOOP; 
    FOR R IN (SELECT owner, object_name from all_objects where object_type in('FUNCTION', 'PROCEDURE') and owner=p_owner) LOOP 
     execute immediate 'grant execute on '||p_owner||'.'||R.object_name||' to '||p_readonly; 
    END LOOP; 
    FOR R IN (SELECT owner, object_name FROM all_objects WHERE object_type in('TABLE', 'VIEW') and owner=p_owner) LOOP 
     EXECUTE IMMEDIATE 'create synonym '||p_readonly||'.'||R.object_name||' for '||R.owner||'."'||R.object_name||'"'; 
    END LOOP; 
    FOR R IN (SELECT owner, object_name from all_objects where object_type in('FUNCTION', 'PROCEDURE') and owner=p_owner) LOOP 
     execute immediate 'create synonym '||p_readonly||'.'||R.object_name||' for '||R.owner||'."'||R.object_name||'"'; 
    END LOOP; 
END; 
0

puede crear el usuario y el privilegio subvención

Crear usuario read_only identificado por read_only; conceder crear sesión, seleccione cualquier tabla para read_only;

Cuestiones relacionadas