需求: 数据库有N张表,每次移交版本的时候都有很多数据脚本。现在想对这些脚本执行前后数据库表中的记录进行监控。
 
想得到这样的结果:脚本执行完毕之后,我可以看到数据中哪张表的数据有变化,能够知道添加或者删除、修改了数据。修改前是什么,修改后是什么。方案:
1、建立触发器,这样的话很简单,对每张表都建立行级触发器。记录insert,delete,update的操作。
2、将数据库中表的数据查询出来,保存在内存或者文本中,执行完脚本在查询一次,对前后两次的文本进行比较。优点不提了~~缺点:
1、要对表进行操作,生产环境当然不能使用,会影响生产环境。坏处一大堆。
2、对大表的话,就没有啥效率可言了吧。几十万条的记录查询出来保存。也不是啥好方法。不知道大家对这个问题有没有什么想法呢?

解决方案 »

  1.   

    不知道Oracle审计功能满足你的需求不?
    如果记录操作日志,去查看oracle的审计功能
    如果要审计用户登录,可以使用系统触发器审计
      

  2.   

    如果你的两套环境的话,建议倒是可以用 streams来做这个监控了。
      

  3.   

    同意楼上的,没有两套环境的话,你只能用LOGMINER提出历史数据和当前数据进行对比了,
      

  4.   

    感谢楼上两位的意见,备份库没有,只是想做的简单点。如果每次对比都要备库的话,通用性就很差了。
    另外用LOGMINER这个的话还得对数据库进行操作,这个还是不行。就只想在现有状况下,加入对脚本执行情况的监控,不改变数据的任何东西,包括表。
      

  5.   

    我的建议可以用cdc,性能上来讲比触发器好些,
      

  6.   

    如果只是简单的监控几张表,那就用TIGGER吧。
      

  7.   


    监控只需要 监控开发人员提交的脚本执行情况,用trigger的话,上生产肯定是不行的。而且这样也比较不通用。就想在不影响当前系统的情况下作监控。
      

  8.   

    建一个监控用户,在执行脚本之前调用一个存储过程用动态语句以CTAS(create table as select *)方式将要监控的表创建到监控用户下。执行完脚步后,比较两边的数据。对比结束不再需要原来的数据的时候,就把监控用户整体删掉
      

  9.   

    select * from all_tables where [条件] 
    自己看all_tables  给你提供了什么?
    修改前执行一遍 修改后执行一遍. 给给我加分啊 这年头回答个问题 不容易 呵呵~
      

  10.   

    补充一下 可能没明白楼主的意思 
    all_tables 有所有表的信息 可以根据表的行数,空间占用 简单的看一下 数据变化... 不知道能不嫩满足你的要求