Você precisará de uma conta separada para conceder acesso somente leitura. Sugiro adicionar uma função à qual você também conceda acesso somente leitura. Você poderá reutilizar essa função se mais usuários precisarem desse acesso no futuro.
CREATE ROLE my_read_only_role;
BEGIN
FOR x IN (SELECT table_name FROM dba_tables WHERE owner=<<schema name>>)
LOOP
EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO my_read_only_role';
END LOOP;
FOR y IN (SELECT view_name FROM dba_views WHERE owner=<<schema name>>)
LOOP
EXECUTE IMMEDIATE 'GRANT SELECT ON ' || y.view_name || ' TO my_read_only_role';
END LOOP;
END;
/
GRANT my_read_only_role TO new_customer_account;
Uma vez feito isso, a nova conta precisará prefixar os nomes das tabelas com o nome do esquema para selecionar os dados. Alternativamente, você poderia criar sinônimos públicos para cada objeto (você pode adicionar outro EXECUTE IMMEDIATE a cada loop no código acima). Ou você pode fazer o usuário executar o comando
ALTER SESSION SET current_schema = <<schema name>>
no login. Você também pode criar um gatilho de login na nova conta que faria isso automaticamente. Isso fará com que <<schema name>>
seja incluído implicitamente como o prefixo do esquema. Ele não afeta os privilégios da sessão - o usuário ainda tem privilégios de somente leitura, o nome do esquema padrão acaba de ser alterado.