特定のユーザーのアクセスを既知のアプリケーションのリストに制限する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)
スコットスキーマにはDBAの役割が付与されていますか? Asktomに関するこの議論 から、DBAグループのメンバーはONLOGONトリガーで切断できないようです。
ちなみに、そのスレッドでは、ソリューションが防弾ではない理由もわかります(例:copy sqlplus.exe foo.exe
)
更新:さらに、このトリガーは次の場合には機能しません。
トリガーがSCOTTによって所有されているかどうかを確認してください。