Se hai il controllo sul modo in cui la tua applicazione si connette (ad es. un'istruzione di inizializzazione per il tuo pool di connessioni), tutto ciò che devi fare è eseguire:
ALTER SESSION SET CURRENT_SCHEMA = PRODUCTS;
Da quel momento in poi (durante la durata della sessione) qualsiasi nome di oggetto non qualificato verrà cercato nel PRODUCTS
schema.
Tutte le sovvenzioni concesse a PRODUCTS_READONLY
sarà in vigore. La sessione verrà eseguita con le credenziali (e le restrizioni di sicurezza) dell'utente originale utilizzato per accedere.
Se non è possibile modificare il modo in cui viene stabilita o inizializzata la connessione, anche un trigger di accesso dovrebbe eseguire questa operazione:
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;
/
Tieni presente che è fondamentale intrappolare qualsiasi eccezione, perché altrimenti un potenziale errore nell'SQL eseguito disconnetterà tutti dal database. Quindi usalo con cura e testalo bene prima di metterlo in produzione.