web-dev-qa-db-ja.com

Oracleユーザーのデフォルトスキーマを設定する方法

Oracleでいくつかの新しいユーザーを作成しました。ただし、sqlplusを実行するときは、クエリでテーブル名をすべて完全に修飾する必要があります。これらの新しいユーザーのデフォルトスキーマを設定する最良の方法は何ですか?

12
Will K

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

設定する方法はないと思います。ユーザーはスキーマです。 AFAIKでは、デフォルトのテーブルスペースしか設定できません。

0
cljk