it-swarm.com.de

Wie lege ich das Standardschema eines Oracle-Benutzers fest?

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?

12
Will K

Es gibt nichts Vergleichbares wie set search_path Von PostgreSQL in Oracle.

Das nächste, was ich mir vorstellen kann, wäre ein Anmeldeauslöser für den Benutzer, der einen ALTER SESSION SET CURRENT_SCHEMA ... Ausführt.

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.

Sofern nicht alle Ihre Oracle-Benutzer an denselben Tabellen arbeiten, würde ich dringend davon abraten, zu verwenden. öffentliche Synonyme, 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;
/
19

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

0
cljk