将数据行内容的变化记入日志(第二部分)

 
   | |

导读:将数据行内容的变化记入日志理想的解决方案就是将新旧值都发送给一个SP,然后SP通过对名字、原来的值、新的值进行比较,并创建一条日志记录。但是,新旧值不能够……

关键词:数据行 内容 变化 写入日志 日志 Oracle PL/SQL

正在加载数据... 【TechTarget中国原创】我想要使用一些写日志的功能性。主要的问题就是,有大量的表中的数据行的内容发生了改变,需要将这些变化记录日志。针对每个数据行,我都需要比较原来的值和新的值,然后只记录下变化的。我不想为每个表中的特定的列名字写一个触发器,这要是维护起来简直就是噩梦(除非我可以使用一些类似AFTER create OR alter ON触发器的东西来重新写入日志触发器?)。理想的解决方案是将新旧值都发送给一个SP,然后SP通过对名字、原来的值、新的值进行比较,并创建一条日志记录。但是,据我所知,新旧值不能够作为一种数组来处理。看起来惟一的办法就是使用如下的语法:old.colname了。您有什么看法吗?

【TechTarget中国原创】  这里有关如何对数据行内容的变化记录日志的后续代码部分。

  此问题提交于2004年10月26日


v_SINGLE_QUOTE char(1):=  chr(39);
 vSep VARchar2(10);


BEGIN
  DBMS_OUTPUT.PUT_LINE(’create OR REPLACE TRIGGER ’ || GENERATE_TRIG_NAME(p_Table_Name));
  DBMS_OUTPUT.PUT_LINE(’  AFTER update ON ’ || p_Table_Name);
  DBMS_OUTPUT.PUT_LINE(’  FOR EACH ROW’);
  DBMS_OUTPUT.PUT_LINE(’DECLARE ’);
  DBMS_OUTPUT.PUT_LINE(’  vTABLE_NAME     VARchar2(30) := ’ || v_SINGLE_QUOTE || p_Table_Name || v_SINGLE_QUOTE || ’;’);
  -- 创建 Key_Value
  DBMS_OUTPUT.PUT_LINE(’  vKEY_VALUE      VARchar2(100) ’);
  FOR c1rec IN c1(p_Table_Name) LOOP
    IF c1rec.POSITION = C1rec.LAST_POSITION THEN
      vSep:=’;’;
    ELSE
      vSep:=’||’’~’’|| ’;
    END IF;
    IF c1rec.data_type = ’DATE’ THEN
       DBMS_OUTPUT.PUT_LINE(’                  to_char(:new.’||c1rec.column_name||’,’’MM-DD-YYYY’’)’ || vSep );
    ELSIF c1rec.data_type = ’NUMBER’ THEN
       DBMS_OUTPUT.PUT_LINE(’                  to_char(:new.’||c1rec.column_name||’)’ || vSep );
    ELSE
       DBMS_OUTPUT.PUT_LINE(’                  :new.’||c1rec.column_name || vSep );
    END IF;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE(’  vACTION_DATE    DATE := SYSDATE’);
  DBMS_OUTPUT.PUT_LINE(’  vUSER_NAME      VARchar2(30) := USER’);
  DBMS_OUTPUT.PUT_LINE(’BEGIN’);
  FOR c2rec IN c2(p_Table_Name) LOOP
    IF c2rec.column_id > 1 THEN
      BEGIN
        DBMS_OUTPUT.PUT_LINE(’  log_change_info (vTABLE_NAME, vKEY_VALUE, vACTION_DATE, vUSER_NAME, ’ );
        DBMS_OUTPUT.PUT_LINE(’                      ’||v_SINGLE_QUOTE||c2rec.COLUMN_NAME||v_SINGLE_QUOTE||’, :old.’||c2rec.COLUMN_NAME||’, :new.’||c2rec.COLUMN_NAME||’);’ );
      EXCEPTION
        WHEN OTHERS THEN
          dbms_output.put_line(’**** ’);
          dbms_output.put_line(’**** Error formatting column: ’||c2rec.column_ID);
          dbms_output.put_line(’**** ’);
      END;
    END IF;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE(’end;’);
  DBMS_OUTPUT.PUT_LINE(’/’);
--EXCEPTION
--  WHEN OTHERS THEN
--    NULL;
END create_AUDIT_TRIG_DYNAMIC;
/

create OR REPLACE PROCEDURE log_change_info   (vTABLE_NAME    IN  VARchar2,
                            vKEY_VALUE     IN  VARchar2,
                            dACTION_DATE   IN  DATE,
                            vUSER_NAME     IN  VARchar2,
                            vCOLUMN_NAME   IN  VARchar2,
                            vOLD_VALUE     IN  VARchar2,
                            vNEW_VALUE     IN  VARchar2) IS
BEGIN
 IF (vNEW_VALUE IS NULL AND vOLD_VALUE IS NOT NULL) OR
     (vNEW_VALUE != vOLD_VALUE) OR
     (vNEW_VALUE IS NOT NULL AND vOLD_VALUE IS NULL) THEN
    insert INTO DATA_CHANGE_AUDIT
               (table_name,
                primary_key_value,
                column_name,
                action_date,
                old_value,
                new_value,
                user_name)
        VALUES (vTABLE_NAME,
                vKEY_VALUE,
                vCOLUMN_NAME,
                NVL(dACTION_DATE,SYSDATE),
                vOLD_VALUE,
                vNEW_VALUE,
                NVL(vUSER_NAME,USER));
  END IF;
END log_change_info;
/
 
查看全文
 
 
 
 
 

Oracle Internals

 
Oracle预计今年夏天会正式收购Sun。一些IT代理商,尤其是来自这两大厂商的关键任务IT厂商,都支持第他们的Oracle许可协议进行更进一步的详细审查。
 
本文说明甲骨文已经正式收购虚拟化软件供应商Virtual Iron Software。
 
如何定义MOM?这项目技术主要有哪些优缺点?目前有哪些类型的MOM产品可用?针对上述问题,作者在本文中作了详细解答。
 
随着许多IT项目动工或完成的延期,Gartner也将它2009全球企业软件收入计划从年增长率6.6%逐渐放缓。Gartner预测今年企业软件市场将不会增长。
 
当以其中的一个表有两个外键指向另一个表的主键时,我们怎样从两个表中检索数据?例如,表A有两个列,Parent_ID和Child_ID。表B有两个列,ID和名字。我们怎样检索数据并……
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录