web-dev-qa-db-fra.com

Oracle - Comment créer un utilisateur en lecture seule

Il est possible de créer un utilisateur de base de données en lecture seule dans une base de données Oracle? Comment?

23
Guilherme Ferreira

Un utilisateur dans une base de données Oracle n'a que les privilèges que vous accordez. Vous pouvez donc créer un utilisateur en lecture seule simplement en n'accordant aucun autre privilège.

Quand vous créez un utilisateur

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

l'utilisateur n'a même pas l'autorisation de se connecter à la base de données. Vous pouvez accorder ça 

GRANT CREATE SESSION to ro_user

et vous pourrez alors accorder les privilèges de lecture souhaités. Par exemple, si vous souhaitez que RO_USER puisse interroger SCHEMA_NAME.TABLE_NAME, procédez comme suit:

GRANT SELECT ON schema_name.table_name TO ro_user

En règle générale, il est toutefois préférable de créer un rôle et d'octroyer les privilèges d'objet à ce rôle pour pouvoir ensuite attribuer le rôle à différents utilisateurs. Quelque chose comme

Créer le rôle

CREATE ROLE ro_role;

Accorder au rôle un accès SELECT sur chaque table d'un schéma particulier

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;

Et puis accorder le rôle à l'utilisateur

GRANT ro_role TO ro_user;
45
Justin Cave
create user ro_role identified by ro_role;
grant create session, select any table, select any dictionary to ro_role;
13
Okloks

Exécutez la procédure suivante, par exemple en tant que système utilisateur.

Définissez p_owner sur le propriétaire du schéma et p_readonly sur le nom de l'utilisateur en lecture seule.

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

vous pouvez créer un utilisateur et accorder des privilèges

create user read_only identifié par read_only; grant create session, sélectionnez une table pour read_only;

0
user128364