Um usuário em um banco de dados Oracle tem apenas os privilégios que você concede. Assim, você pode criar um usuário somente leitura simplesmente não concedendo nenhum outro privilégio.
Ao criar um usuário
CREATE USER ro_user
IDENTIFIED BY ro_user
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;
o usuário nem tem permissão para fazer login no banco de dados. Você pode conceder isso
GRANT CREATE SESSION to ro_user
e então você pode conceder quaisquer privilégios de leitura que desejar. Por exemplo, se você quiser
RO_USER
para poder consultar SCHEMA_NAME.TABLE_NAME
, você faria algo como GRANT SELECT ON schema_name.table_name TO ro_user
Geralmente, no entanto, é melhor criar uma função e conceder os privilégios de objeto à função para que você possa conceder a função a diferentes usuários. Algo como
Crie o papel
CREATE ROLE ro_role;
Conceda o acesso SELECT da função em cada tabela em um esquema específico
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;
E, em seguida, conceda a função ao usuário
GRANT ro_role TO ro_user;