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?
W set search_path
Oracle 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;
/
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 ?Nie sądzę, że istnieje sposób, aby go ustawić. Użytkownik jest schematem. AFAIK możesz ustawić tylko domyślny obszar tabel.
źródło