Ho creato alcuni nuovi utenti in Oracle. Tuttavia, quando si esegue sqlplus, tutti devono qualificare pienamente i nomi delle tabelle nelle query. Qual è il modo migliore per impostare uno schema predefinito per questi nuovi utenti?
Ho creato alcuni nuovi utenti in Oracle. Tuttavia, quando si esegue sqlplus, tutti devono qualificare pienamente i nomi delle tabelle nelle query. Qual è il modo migliore per impostare uno schema predefinito per questi nuovi utenti?
Risposte:
Non c'è niente come PostgreSQL set search_path
in Oracle.
La cosa più vicina che mi viene in mente sarebbe un trigger di accesso per l'utente che esegue è un ALTER SESSION SET CURRENT_SCHEMA ...
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON SCHEMA
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
EXCEPTION
when others
then null; -- prevent a login failure due to an exception
END;
/
Se l'elenco degli utenti non è troppo lungo, è possibile creare un trigger di accesso al database in modo da non dover creare quel trigger per ciascun utente:
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON DATABASE
BEGIN
if (user in ('TOM', 'DICK', 'HARRY')) then
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
end if;
exception
when others
then null; -- prevent a login failure due to an exception
END logon_trg;
/
Naturalmente l'elenco di utenti in cui si desidera modificare lo schema predefinito, può anche essere preso da una tabella. In tal caso, è sufficiente inserire o eliminare righe da lì per "attivare" questa funzione (anziché ricreare il trigger ogni volta).
Un'altra opzione sarebbe quella di creare sinonimi ogni volta che si crea un utente che punta alle tabelle reali. È possibile automatizzarlo utilizzando una procedura memorizzata che scorre in tutte le tabelle in uno schema e crea i sinonimi per essi nell'altro schema.
A meno che tutti i tuoi utenti Oracle non lavorino sulle stesse tabelle, ti consiglio vivamente di non utilizzare sinonimi pubblici che dovresti creare una sola volta: possono causare molti problemi se esistono diversi utenti dell'applicazione nella tua installazione.
Modifica :
Seguendo il suggerimento di Alex, ecco un trigger di accesso che controlla il ruolo anziché un nome utente:
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON DATABASE
declare
has_role boolean;
BEGIN
has_role := dbms_session.is_role_enabled('FOOBAR_ROLE');
if (has_role) then
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
end if;
exception
when others
then null; -- prevent a login failure due to an exception
END logon_trg;
/
when others then null;
è un tutto sommato, complicherà la risoluzione dei problemi poiché rende invisibile qualsiasi errore. Forse rimuovere completamente l'eccezione o registrare l'errore sul server in una transazione AUTONOMA e quindi rialzarlo ?