Wie lege ich das Standardschema eines Oracle-Benutzers fest?

12

Ich habe einige neue Benutzer in Oracle erstellt. Wenn Sie jedoch sqlplus ausführen, müssen alle die in der Abfrage enthaltenen Tabellennamen vollständig qualifizieren. Wie kann ein Standardschema für diese neuen Benutzer am besten festgelegt werden?

ein Pferd ohne Name
quelle

Antworten:

19

Es gibt nichts Vergleichbares wie PostgreSQL set search_pathin Oracle.

Das nächste, was ich mir vorstellen kann, wäre ein Anmeldeauslöser für den Benutzer, der ein ausführt 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;
/  

Wenn die Liste der Benutzer nicht zu lang ist, können Sie einen Datenbankanmeldetrigger erstellen, damit Sie diesen Trigger nicht für jeden Benutzer erstellen müssen:

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

Natürlich kann die Liste der Benutzer, bei denen Sie das Standardschema ändern möchten, auch einer Tabelle entnommen werden. In diesem Fall müssen Sie nur Zeilen von dort einfügen oder löschen, um diese Funktion zu "aktivieren" (anstatt den Trigger jedes Mal neu zu erstellen).

Eine andere Möglichkeit wäre, jedes Mal Synonyme zu erstellen, wenn Sie einen Benutzer erstellen, der auf die realen Tabellen verweist. Sie können dies mithilfe einer gespeicherten Prozedur automatisieren, die alle Tabellen in einem Schema durchläuft und die Synonyme für sie im anderen Schema erstellt.

Wenn nicht alle Oracle-Benutzer an denselben Tabellen arbeiten, würde ich dringend davon abraten, öffentliche Synonyme zu verwenden, die Sie nur einmal erstellen müssten. Sie können große Probleme verursachen, wenn in Ihrer Installation unterschiedliche Anwendungsbenutzer vorhanden sind.

Bearbeiten :

Nach Alex 'Vorschlag gibt es hier einen Anmeldetrigger, der die Rolle und nicht einen Benutzernamen überprüft:

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;
/
ein Pferd ohne Name
quelle
Tolle Idee, aber da dies when others then null;ein Allheilmittel ist, wird es die Fehlerbehebung erschweren, da es jeden Fehler unsichtbar macht. Entfernen Sie möglicherweise die Ausnahmebehandlung vollständig oder protokollieren Sie den Fehler auf dem Server in einer AUTONOMOUS-Transaktion und erhöhen Sie ihn dann erneut ?
George3
@ George3: aber wenn die Ausnahme tatsächlich ausgelöst wird, kann sich der Benutzer nicht anmelden - ich wollte nur verhindern, dass sich jemand nicht anmelden kann, nur weil ein dummer Fehler im Trigger vorliegt. Es steht jedoch jedem frei, dies an seine Wünsche anzupassen.
a_horse_with_no_name
0

Ich würde nicht denken, dass es einen Weg gibt, einen festzulegen. Der Benutzer ist das Schema. AFAIK Sie können nur Standardtabellenbereiche festlegen.

cljk
quelle