Oracleでいくつかの新しいユーザーを作成しました。ただし、sqlplusを実行するときは、クエリでテーブル名をすべて完全に修飾する必要があります。これらの新しいユーザーのデフォルトスキーマを設定する最良の方法は何ですか?
OracleにはPostgreSQLのset search_path
のようなものはありません。
私が考えることができる最も近いものは、実行するユーザーのログオントリガーです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つのスキーマのすべてのテーブルをループし、他のスキーマでそれらのシノニムを作成するストアドプロシージャを使用して、自動化できます。
allでない限り、Oracleユーザーは同じテーブルで作業しますpublicシノニムを使用しないことを強くお勧めします作成する必要があるのは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;
/
設定する方法はないと思います。ユーザーはスキーマです。 AFAIKでは、デフォルトのテーブルスペースしか設定できません。