Jak ustawić domyślny schemat użytkownika Oracle?

12

Stworzyłem kilku nowych użytkowników w Oracle. Jednak podczas uruchamiania narzędzia sqlplus wszyscy muszą w pełni kwalifikować nazwy tabel w zapytaniu. Jak najlepiej ustawić domyślny schemat dla tych nowych użytkowników?

koń bez imienia
źródło

Odpowiedzi:

19

W set search_pathOracle nie ma nic takiego jak PostgreSQL .

Najbliższą rzeczą, o której mogę pomyśleć, byłby wyzwalacz logowania dla uruchamianego użytkownika 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;
/  

Jeśli lista użytkowników nie jest zbyt długa, możesz utworzyć wyzwalacz logowania do bazy danych, aby nie trzeba było tworzyć tego wyzwalacza dla każdego użytkownika:

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

Oczywiście listę użytkowników, w których chcesz zmienić domyślny schemat, można również pobrać z tabeli. W takim przypadku wystarczy wstawić lub usunąć wiersze, aby „aktywować” tę funkcję (zamiast ponownie tworzyć wyzwalacz za każdym razem).

Inną opcją byłoby utworzenie synonimów za każdym razem, gdy tworzysz użytkownika, który wskazuje na rzeczywiste tabele. Można to zautomatyzować za pomocą procedury składowanej, która zapętla wszystkie tabele w jednym schemacie i tworzy dla nich synonimy w drugim schemacie.

O ile wszyscy użytkownicy Oracle nie pracują na tych samych tabelach, zdecydowanie odradzam używanie publicznych synonimów, które musielibyście utworzyć tylko raz - mogą sprawić wiele problemów, jeśli w instalacji istnieją różni użytkownicy aplikacji.

Edytuj :

Zgodnie z sugestią Alexa, oto wyzwalacz logowania, który sprawdza rolę, a nie nazwę użytkownika:

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;
/
koń bez imienia
źródło
Świetny pomysł, ale ponieważ when others then null;jest to wszystko, skomplikuje rozwiązywanie problemów, ponieważ powoduje, że każdy błąd jest niewidoczny. Może całkowicie usuń obsługę wyjątków lub zaloguj błąd na serwerze w transakcji AUTONOMICZNEJ, a następnie ponownie go PODARUJ ?
George3
@ George3: ale jeśli rzeczywiście zostanie zgłoszony wyjątek, użytkownik nie może się zalogować - chciałem tylko, aby ktoś nie mógł się zalogować tylko z powodu głupiego błędu w pomiarze. Ale każdy może dostosować to do tego, czego chce.
a_horse_w_no_name
0

Nie sądzę, że istnieje sposób, aby go ustawić. Użytkownik jest schematem. AFAIK możesz ustawić tylko domyślny obszar tabel.

cljk
źródło