代码之家  ›  专栏  ›  技术社区  ›  broschb

数据库审核表

  •  2
  • broschb  · 技术社区  · 16 年前

    storeNo 
    timeChanged
    user 
    tableChanged 
    fieldChanged 
    BeforeValue 
    AfterValue
    

    通常,我在每个表上都有简单的审计列,提供userChanged和timeChanged值。将写入这些表的应用程序是一个java应用程序,调用是通过oracle数据库上的jdbc进行的。我的问题是,获得前后值的最佳方法是什么。我讨厌比较对象,看看为了填充这个表做了什么更改,这不会有效率。如果一次更新中有几列发生了变化,那么这个新表将有几个条目。或者在神谕中有办法做到这一点吗?其他人过去做了什么来跟踪变化和变化的价值观?

    4 回复  |  直到 16 年前
        1
  •  10
  •   skaffman    16 年前

    传统上,这就是oracle触发器的用途。每次插入或更新都会触发一个存储过程,该存储过程可以访问“前后”数据,您可以随意处理这些数据,例如将旧值记录到审计表中。它对应用程序是透明的。

    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:59412348055

        2
  •  2
  •   APC    16 年前

    如果您使用Oracle 10g或更高版本,则可以使用内置的审计功能。你为许可证付了很多钱,还不如用它。

    http://www.oracle.com/technology/pub/articles/10gdba/week10_10gdba.html

        3
  •  2
  •   jva    16 年前

    可怕的话。

    create or replace trigger emp_bur before insert on emp for each row
    begin
        if :new.ename = :old.ename then
            insert_audit_record('EMP', 'ENAME', :old.ename, :new.ename);
        end if;
        if :new.sal = :old.sal then
            insert_audit_record('EMP', 'SAL', :old.sal, :new.sal);
        end if;
        if :new.deptno = :old.deptno then
            insert_audit_record('EMP', 'DEPTNO', :old.deptno, :new.deptno);
        end if;
    end;
    /
    

    正如您所看到的,它涉及大量的重复,但通过在数据字典上构建代码生成器,这很容易处理。但这种方法存在更严重的问题。

    1. 一次更新,每次更新十次 字段将生成十个插入
    2. 必须处理不同的数据类型- 有趣,更不用说CLOB了。
    3. 重建国家很难 需要尽早开始 记录的版本并应用
    4. 以及DELETE语句。

    现在,如果客户的基本要求是监控少数敏感列(员工)的更改,那么这些异议都不是问题。工资、信用卡。极限等。但是,如果要求监视每个表的更改,则“完整记录”方法更好:只需为受DML影响的每一行插入一个审计记录。

        4
  •  0
  •   Jay    16 年前

    我对触发器也一样。

    1. 启动交易
    2. 对于每个要更改的字段,从记录中获取旧值,从程序逻辑中获取新值

    如果有很多这样的东西,我想我会创建一个更新记录函数来进行比较,无论是在通用级别还是为每个表创建一个单独的函数。