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


12

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

回答:


19

set search_pathOracleには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トランザクションでログに記録してから、再度発生させますか?
George3

@ George3:しかし、例外が実際にスローされた場合、ユーザーはログインできません-トリガーで誤った愚かさのために誰かがログインできないようにしたかっただけです。しかし、誰でも彼/彼女が望むものにこれを自由に適応させることができます。
a_horse_with_no_name 2012年

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.