Il est possible de créer un utilisateur de base de données en lecture seule dans une base de données Oracle? Comment?
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;
create user ro_role identified by ro_role;
grant create session, select any table, select any dictionary to ro_role;
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;
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;