回答:
set search_path
OracleにはPostgreSQLのようなものはありません。
私が考えることができる最も近いものは、実行しているユーザーのログオントリガーです 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;
/
ユーザーのリストが長すぎない場合は、データベースログオントリガーを作成して、ユーザーごとにトリガーを作成する必要がないようにすることができます。
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;
/
もちろん、デフォルトのスキーマを変更するユーザーのリストは、テーブルから取得することもできます。その場合、この機能を「アクティブ化」するためにそこから行を挿入または削除するだけで済みます(毎回トリガーを再作成するのではなく)。
別のオプションは、実際のテーブルを指すユーザーを作成するたびにシノニムを作成することです。1つのスキーマのすべてのテーブルをループし、他のスキーマでそれらのシノニムを作成するストアドプロシージャを使用して、自動化できます。
すべてのOracleユーザーが同じテーブルで作業しない限り、 1回だけ作成する必要があるパブリックシノニムを使用しないことを強くお勧めします。異なるアプリケーションユーザーがインストールに存在する場合、多くの問題を引き起こす可能性があります。
編集:
Alexの提案に従い、ユーザー名ではなく役割をチェックするログオントリガーを次に示します。
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;
すべてを網羅しているため、エラーが見えなくなるため、トラブルシューティングが複雑になります。例外処理を完全に削除するか、サーバー上のエラーをAUTONOMOUSトランザクションでログに記録してから、再度発生させますか?