Oracle中的审计跟踪系统

时间:2012-07-26 12:48:01

标签: oracle11g audit-trail

我正在尝试为我的Oracle-Java应用程序构建审计跟踪系统。我在Google上做了很多搜索。找到了一些解决方案,大多建议使用触发器。但是使用这种方法的问题是我将无法跟踪哪个应用程序用户正在进行更改。我想跟踪用户ID以及更改。你们能告诉我什么是最好的方法吗?

1 个答案:

答案 0 :(得分:0)

如果您希望数据库审核信息,您需要做一些事情让数据库知道哪些应用程序用户登录到特定会话。有多种方法可以做到这一点,其中许多方法取决于应用程序架构。假设这是一个标准的3层应用程序,一种方法是创建一个上下文

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过程。如果这是一个带有连接池的三层应用程序,则每次用户从池请求连接时都需要这样做。

SQL> exec login_pkg.set_user( 'Justin' );

PL/SQL procedure successfully completed.

在触发器代码(或PL / SQL中的其他位置)中,您可以查询上下文以确定当前应用程序用户的身份。

SQL> select sys_context( 'LOGIN_CTX', 'USER_NAME' )
  2    from dual;

SYS_CONTEXT('LOGIN_CTX','USER_NAME')
--------------------------------------------------------------------------------
Justin

如果您要审核其他元素,则可以在上下文中设置所需的任意属性(即,您可以传入客户端IP地址或会话ID或中间层有权访问的任何其他内容)。

其他选项包括在数据库中为应用程序用户使用代理用户,设置包变量而不是使用上下文,或让应用程序执行审计。