Se você tiver controle sobre a maneira como seu aplicativo se conecta (por exemplo, uma instrução de inicialização para seu pool de conexões), tudo o que você precisa fazer é executar:
ALTER SESSION SET CURRENT_SCHEMA = PRODUCTS;
A partir desse ponto (durante a duração da sessão), qualquer nome de objeto não qualificado será pesquisado em
PRODUCTS
esquema. Todas as concessões concedidas a
PRODUCTS_READONLY
estará em vigor. A sessão será executada com as credenciais (e restrições de segurança) do usuário original usado para fazer login. Se você não puder alterar a maneira como a conexão é estabelecida ou inicializada, um gatilho de logon também deve fazer isso:
create or replace trigger logon_trg
after logon on database
begin
if (user = 'PRODUCTS_READONLY') then
execute immediate 'alter session set current_schema = products';
end if;
exception
when others then null; -- prevent a login failure due to an exception
end logon_trg;
/
Observe que é crucial interceptar qualquer exceção, porque, caso contrário, um erro potencial no SQL executado efetivamente desconectará todos do banco de dados. Portanto, use com cuidado e teste-o bem antes de colocá-lo em produção.