web-dev-qa-db-ja.com

ログオントリガーからのOracleセッションの切断

特定のユーザーのアクセスを既知のアプリケーションのリストに制限するOracle11gログオントリガーを構築しようとしています。たとえば、ユーザーSCOTTは_MYAPP.EXE_とのみ接続できます。

私は正しいトリガーとロジックを持っていると思いますが、私が抱えている問題は、RAISE_APPLICATION_ERROR();がセッションを強制終了しないことです。トリガーが有効になっていて、_ADMINISTER DATABASE TRIGGER_特権を付与しようとしましたが、まだ何かが足りません。

この例 に基づいて、これまでに持っているトリガー(同じユーザーが所有)は次のとおりです。

_CREATE OR REPLACE TRIGGER global_logon_trg AFTER logon ON DATABASE
DECLARE
   p_session_user  varchar2(64);
   p_module        varchar2(64);
BEGIN
   SELECT UPPER(SYS_CONTEXT('USERENV', 'SESSION_USER')) INTO p_session_user FROM DUAL;
   SELECT UPPER(SYS_CONTEXT('USERENV', 'MODULE')) INTO p_module FROM DUAL;

   DBMS_SESSION.SET_IDENTIFIER(p_session_user || '-' || p_module);

   IF ((p_session_user = 'SCOTT') AND (p_module IN ('MYAPP.EXE'))) THEN
      DBMS_SESSION.SET_IDENTIFIER('about to raise app_error..');
      RAISE_APPLICATION_ERROR(-20003,'You are not allowed to connect to the database');
   END IF;

END;
/
_

ただし、SQL * Plusを使用してSCOTTとしてログインしても機能します。次に、次のクエリを使用して_v$session_をクエリすると、次のようになります。

_select username, client_identifier
from v$session
where username not in ('SYSMAN', 'DBSNMP');
_

次の結果が得られます。

_USERNAME           CLIENT_IDENTIFIER
------------------ -----------------------------------
SCOTT              about to raise app_error..
_

何が欠けていますか?これは特権のものですか、トリガーコードのものですか、それとも Oracleのバグ のものですか?それとも、私がやろうとしていることを行うためのより良い方法はありますか?! (データベースとそれが置かれているサーバーを完全に制御できます。それで簡単になります!)

_Oracle Database 11g Release 11.1.0.6.0 - Production_を使用しています

あなたの助けと提案に感謝します

アンドリュー:o)

1
Andrew

TOM KYTEのブログ/ Q&Aサイトをチェックしてください asktom 。これが期待どおりに機能しない微妙な理由があるかもしれません。

あなたの問題は2つの例のために ここここ について議論しました。

別の方法は、アプリケーションとアプリケーションで構成されたパスワードによってのみ有効になるアプリケーションロールを使用することです。

DBAとして、SQLPLUSを介したデータベースへのアクセスを制限したくありません。これは、多くの場合、病気のデータベースにアクセスするための最良のルートであるためです。そして、それをグローバルなトリガーにすること。まさかメイティ!

1
Guy

スコットスキーマにはDBAの役割が付与されていますか? Asktomに関するこの議論 から、DBAグループのメンバーはONLOGONトリガーで切断できないようです。

ちなみに、そのスレッドでは、ソリューションが防弾ではない理由もわかります(例:copy sqlplus.exe foo.exe

更新:さらに、このトリガーは次の場合には機能しません。

  • トリガーの所有者はSCOTTです(つまり、実際にトリガーを所有している場合、彼は切断されません。これは、偶発的なセルフロックを防ぐためである必要があります)、
  • ユーザーには特権がありますデータベーストリガーの管理

トリガーがSCOTTによって所有されているかどうかを確認してください。

1
Vincent