我对数据库不熟悉,现在想写一个触发器用来记录一个表中的哪些字段被修改,修改成了什么,我应当如何来写呢?
谢谢各位了.

解决方案 »

  1.   

    你是说字段的值?还是字段的名字?字段的名字的话,就需要用到系统监查了。字段的值的话,NEW.字段名就是新的值,OLD.字段名就是旧的值。想知道什么变化了,比较一下就知道了。
      

  2.   

    謝謝Croatia 
    請問能否通過列編號來訪問該字段呢?
      

  3.   

    你可以通过系统视图来查出你的表中的相应列名,然后 取到列名的数组,你就可以 拼写你想要的代码了。好像是这个视图,你试一下。
    sys.all_columns
      

  4.   

    create table mytail(
    SESSION_ID    NUMBER,
    TIMESTAMP     DATE,
    DB_USER       VARCHAR2(30),
    OS_USER       VARCHAR2(255),
    USERHOST      VARCHAR2(128),
    CLIENT_IP     VARCHAR2(255),
    machine       VARCHAR2(255),
    program       VARCHAR2(255),
    EXT_NAME      VARCHAR2(4000),
    OBJECT_SCHEMA VARCHAR2(30),
    OBJECT_NAME   VARCHAR2(128),
    SCN           NUMBER,
    SQL_TEXT      VARCHAR2(4000),
    SQL_BIND      VARCHAR2(4000));
    create or replace trigger atest
      after DELETE OR INSERT OR UPDATE ON a
    declare
      n        number;
      stmt     varchar2(4000);
      sql_text ora_name_list_t;
    begin
      n := ora_sql_txt(sql_text);
      FOR i IN 1 .. n LOOP
        stmt := stmt || sql_text(i);
      END LOOP;
      insert into mytail
        (SESSION_ID, DB_USER, CLIENT_IP, SQL_TEXT, OBJECT_NAME, OBJECT_SCHEMA)
      values
        (USERENV('SESSIONID'),
         user,
         sys_context('userenv', 'ip_address'),
         stmt,
         'T1',
         'RAINY');end;
      

  5.   

    从oracle 9.0.7版本开始,6楼的方法就不起作用了。ora_sql_txt方法始终返回空。需要系统事情触发器的支持
      

  6.   

    建立一个记录表table_log(filed,new,old,time)
    然后为表的每个字段定义一个行级触发器,把修改的值能过:new  :old插入到table_log中,
    filed字段值根据表不同字段上的行级触发器,设为相应的的默认值!!方法比较笨,如果很多表要实现这样的功能,性能会很差!!
    如果没有其它的方法可以考虑一下!!