it-swarm-eu.dev

Jak nastavit výchozí schéma uživatele Oracle?

V Oracle jsem vytvořil několik nových uživatelů. Při spuštění programu sqlplus však všichni potřebují plně kvalifikovat názvy tabulek v dotazu. Jaký je nejlepší způsob, jak nastavit výchozí schéma pro tyto nové uživatele?

12
Will K

V Oracle není nic jako set search_path PostgreSQL!.

Nejbližší věc, na kterou si pomyslím, by byl přihlašovací spoušť pro uživatele, který běží, je 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;
/  

Pokud seznam uživatelů není příliš dlouhý, můžete vytvořit spouštěč přihlášení k databázi, takže pro každého uživatele nemusíte toto spouštění vytvářet:

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;
/  

Seznam uživatelů, u kterých chcete změnit výchozí schéma, je samozřejmě možné převzít také z tabulky. V takovém případě stačí vložit nebo smazat řádky odtud, abyste tuto funkci „aktivovali“ (raději než znovu vytvořili spouštěč).

Další možností by bylo vytvořit synonyma pokaždé, když vytvoříte uživatele, který odkazuje na skutečné tabulky. Můžete to zautomatizovat pomocí uložené procedury, která prochází všemi tabulkami v jednom schématu a vytváří pro ně synonyma v druhém schématu.

Pokud všichni vaši uživatelé Oracle pracují na stejných tabulkách, důrazně nedoporučuji používat veřejná synonyma, která byste museli vytvořit pouze jednou - mohou způsobit mnoho problémů, pokud ve vaší instalaci existují různí uživatelé aplikace.

pravit:

Podle Alexova návrhu je zde přihlašovací spoušť, která kontroluje roli spíše než uživatelské jméno:

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;
/
19

Já bych si nemyslel, že existuje způsob, jak nastavit jeden. Uživatel je schéma. AFAIK můžete nastavit pouze výchozí tabulkový prostor.

0
cljk