Come impostare lo schema predefinito di un utente Oracle?


12

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:


19

Non c'è niente come PostgreSQL set search_pathin 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;
/

Ottima idea, ma dal momento che 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 ?
George3,

@ George3: ma se l'eccezione viene effettivamente lanciata, l'utente non può accedere - Volevo solo impedire a qualcuno di non essere in grado di accedere solo a causa di uno stupido errore nel trigger. Ma chiunque è libero di adattarlo a ciò che vuole.
a_horse_with_no_name

0

Non credo ci sia un modo per impostarne uno. L'utente è lo schema. AFAIK puoi solo impostare il tablespace predefinito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.