Es gibt nichts Vergleichbares wie PostgreSQL set search_path
in 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;
/
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 ?