Oracle-Java アプリケーションの監査追跡システムを構築しようとしています。私はGoogleでたくさんの検索をしました。主にトリガーを使用することをお勧めします。しかし、このアプローチの問題点は、どのアプリケーション ユーザーが変更を行っているかを追跡できないことです。変更とともにユーザー ID も追跡したいと考えています。最善のアプローチは何ですか?
1 に答える
データベースに情報を監査させたい場合は、特定のセッションにどのアプリケーション ユーザーがログインしているかをデータベースに知らせる必要があります。これにはさまざまな方法がありますが、その多くはアプリケーション アーキテクチャに依存します。これが標準の 3 層アプリケーションであると仮定すると、1 つのアプローチはコンテキストを作成することです。
SQL> create context login_ctx using login_pkg;
Context created.
SQL> create or replace package login_pkg
2 as
3 procedure set_user( p_username in varchar2 );
4 end;
5 /
Package created.
SQL> ed
Wrote file afiedt.buf
1 create or replace package body login_pkg
2 as
3 procedure set_user( p_username in varchar2 )
4 as
5 begin
6 dbms_session.set_context( 'LOGIN_CTX', 'USER_NAME', p_username );
7 end;
8* end;
SQL> /
Package body created.
その後、アプリケーションはlogin_pkg.set_user
、新しいアプリケーション ユーザーが特定のセッションを使用するたびに、プロシージャを呼び出す必要があります。これが接続プールを持つ 3 層アプリケーションの場合、ユーザーがプールからの接続を要求するたびに、これが発生する必要があります。
SQL> exec login_pkg.set_user( 'Justin' );
PL/SQL procedure successfully completed.
トリガー・コード(またはPL/SQLの他の場所)で、コンテキストを問い合せて、現在のアプリケーション・ユーザーのIDを判別できます。
SQL> select sys_context( 'LOGIN_CTX', 'USER_NAME' )
2 from dual;
SYS_CONTEXT('LOGIN_CTX','USER_NAME')
--------------------------------------------------------------------------------
Justin
監査したい他の要素がある場合は、コンテキストに必要な任意の属性を設定できます (つまり、クライアント IP アドレスやセッション ID など、中間層がアクセスできるものを渡すことができます)。
その他のオプションには、アプリケーション ユーザーのデータベースでプロキシ ユーザーを使用する、コンテキストを使用する代わりにパッケージ変数を設定する、アプリケーションに監査を実行させるなどがあります。