大家都知道,对于一个表的delete 、update、 insert操作都是可以通过写触发器来捕捉的。我现在有个问题,就是对于表的一般的select 访问,能不能也通过类似触发器的技术来实现呢?比如说我可以写一个触发器,当我的表A被更新的时候,就往表B里面插入一条数据,那么我能不能写一个什么东西,当我的表A仅仅是被select的时候就往表B里面写入一条数据呢?谢谢各位前辈。

解决方案 »

  1.   

    开启审计。
    audit该表所有dml、ddl,可以实现。
      

  2.   

    一 审计功能的参数控制
    audit_trail 参数的值可以设置为以下几种1. NONE:不开启
    2. DB:开启审计功能
    3. OS:审计记录写入一个操作系统文件。
    4. TRUE:与参数DB一样
    5. FALSE:不开启审计功能。
    这个参数是写道spfile里面的,需要重启数据库二 查看是否审计功能是否启动
    SQL> show parameter audit
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    audit_file_dest                      string      /u01/app/oracle/admin/ORCL/adump
    audit_sys_operations                 boolean     FALSE
    audit_syslog_level                   string
    audit_trail                          string      NONE三 开启审计
    SQL> conn /as sysdba
    SQL> show parameter audit
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    audit_file_dest                      string      /u01/app/oracle/admin/ORCL/adump
    audit_sys_operations                 boolean     FALSE
    audit_syslog_level                   string
    audit_trail                          string      NONESQL> alter system set audit_sys_operations=TRUE scope=spfile;    --审计管理用户(以sysdba/sysoper角色登陆)
    SQL> alter system set audit_trail=db,extended scope=spfile;重启实例 
    SQL> show parameter audit
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    audit_file_dest                      string      /u01/app/oracle/admin/ORCL/adump
    audit_sys_operations                 boolean     TRUE
    audit_syslog_level                   string
    audit_trail                          string      DB, EXTENDED      
    (完成)
      

  3.   

    可以,你去查看视图V$SQL里有访问记录,筛选出来就 可以了,我想查它的实体表,都是找不到,高手顺便帮忙解答下,如果可以查到实体表,筛选就更有把握 了
      

  4.   

    V$SQL里的记录随着时间可能会被抹除,ORACLE有专门的维护算法。
      

  5.   

    这个我知道啊写个JOB,5秒自动去取V$SQL里的数据MERGE到另外张表,GOOGLE查了,没有实体表'?继续搜
      

  6.   

    可以尝试使用审计功能来做
    具体的使用方法百度或者google一下就有很多很详细的文章
    这里就不贴出来了
      

  7.   

    v$sql视图中存放的好像都是oracle自己在解析我们输入的sql语句时,它自己运行执行的sql语句或过程吧!
    叫一般人去看这个,我估计头有点大了。我给出一部分通过该试图查询出来的结果:
    SELECT ANALYZETIME FROM (SELECT ANALYZETIME FROM TABPART$ T WHERE T.OBJ# = :B1 UNION ALL SELECT ANALYZETIME FROM TABCOMPART$ T WHERE T.OBJ# = :B1 )
    以前没有怎么看过审计功能,因为在项目中没有怎么用到过,不过听大家这么一说,我下来一定得花点time去看看这个叫审计的东东。