0

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

4

1 回答 1

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 或中间层可以访问的任何其他内容)。

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

于 2012-07-26T15:33:56.700 回答