表A(column1,column2.column3)、LOG(列名,变更前,变更后)
现在给表A建立一个update的触发器。
更新A表中3个字段时,分别向LOG表插入数据。
例:更新A三个字段数据都发生变化,那么向LOG中插入3条数据。
现在代码:
create or replace
TRIGGER trigger_a
BEFORE UPDATE
   ON A
   FOR EACH ROW 
BEGIN
    IF :new.column1 != :old.column1 THEN
          INSERT INTO LOG(列名,变更前,变更后) 
                    VALUES (column1,变更前值,变更后值);
    END IF;
    IF :new.column2 != :old.column2 THEN
          INSERT INTO LOG(列名,变更前,变更后) 
                    VALUES (column2,变更前值,变更后值);
    END IF;
    IF :new.column3 != :old.column3 THEN
          INSERT INTO LOG(列名,变更前,变更后) 
                    VALUES (column3,变更前值,变更后值);
    END IF;EXCEPTION
   WHEN OTHERS THEN
   DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);END;问题:现在的这样是可以实现的,但是想根据列名动态的实现这个功能,不写这么多重复的代码,可以实现吗?求指教~~oracleeach触发器

解决方案 »

  1.   

    貌似没什么办法了,不过其实你也可以指定列来建立触发器嘛。还有就是如果不是修改触发器指定的表,最好还是用后置触发器啦。
    格式是create or replace
    TRIGGER trigger_a
    AFTER UPDATE of column
       ON A
       FOR EACH ROW 
      

  2.   


    嗯。触发器创建在列上后,但是最后更新T_LOG表时候还需要通过new.列名取出值来不是嘛?
      

  3.   


    可以吗?能具体说一下吗?
    你指的是先把SQL拼写出来然后再EXECUTE IMMEDIATE 执行吗?
    这个方案报错:ORA-01008
      

  4.   

    如果LOG表结构是这么设计的,就只能这么写了。
      

  5.   

    要根据user_tab_column去循环去字段名,但是触发器里面的new和old值,前面都是有冒号么,在动态SQL里就是绑定变量了。这怎么处理??
      

  6.   

    可否变通一下呢,对于所有的更新,把表A的全部字段全部全部放入log表,然后对log表进行判断
    delete from log t where t.变更前=t.变更后;
    commit;