Oracle 11G CRUD操作监控单个表

Oracle 11G CRUD操作监控单个表

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

前言:
    线上oracle数据库有张表的数据有些乱,依据应用db的log和应用的log也没有检查出来谁改动了。所以决定把这张单表做个具体的insert、update、delete监控。



一:使用数据库自带的审计功能
1,查看审计功能是否启动

SQL> show parameter audit                                                                                                                                                                      







NAME     TYPE VALUE


———————————— ———– ——————————


audit_file_dest     string /oracle/app/oracle/admin/power


des/adump


audit_sys_operations     boolean FALSE


audit_syslog_level     string


audit_trail     string NONE


SQL> 


没有开启审计功能。须要自己去开启一下。






2,开启审计功能

须要用sysdba,注意audit_trail要为DB_EXTENDED才记录运行的具体语句…


alter system set audit_sys_operations=TRUE scope=spfile;


SQL> alter system set audit_sys_operations=TRUE scope=spfile;                                                                                                                                  


                                                                                                                                                                                               


System altered.






SQL>



再次查看审计功能是否启动


SQL> show parameter audit;                                                                                                                                                                     






NAME     TYPE VALUE


———————————— ———– ——————————


audit_file_dest     string /oracle/app/oracle/admin/power


des/adump


audit_sys_operations     boolean FALSE


audit_syslog_level     string


audit_trail     string NONE


SQL>          






须要重新启动实例才干看到状态。






3。关闭审计功能

SQL> alter system set audit_trail = none scope=spfile;






4,针对某张表的审计功能

AUDIT UPDATE,DELETE,INSERT ON T_TEST by access;






5。对该张表进行各种DML操作測试





6,查询审计的信息

select EXTENDED_TIMESTAMP,SESSION_ID,SQL_TEXT from DBA_COMMON_AUDIT_TRAIL ORDER BY EXTENDED_TIMESTAMP DESC;






二,採用触发器
        看到线上数据库load比曾经添加蛮多的。为了单张表的监控开启审计比較消耗资源。有些不划算。所以能够採用第二种办法来做。就是在表上建立触发器。



1。先建立建立測试表:
查看已经建立的表 aaa_test与trig_sql。
SQL> describe plas.aaa_test;                                                                                                                                                                   
 Name   Null?    Type
 —————————————– ——– —————————-
 ID    NUMBER
 NAME    VARCHAR2(100)
 LOGIN_TIME    DATE


SQL>
SQL> describe plas.trig_sql;                                                                                                                                                                   
 Name   Null?    Type
 —————————————– ——– —————————-
 LT    DATE
 SID    NUMBER
 SERIAL#    NUMBER
 USERNAME    VARCHAR2(30)
 OSUSER    VARCHAR2(64)
 MACHINE    VARCHAR2(32)
 TERMINAL    VARCHAR2(16)
 PROGRAM    VARCHAR2(64)
 SQLTEXT    VARCHAR2(2000)
 STATUS    VARCHAR2(30)
 CLIENT_IP    VARCHAR2(60)


SQL> 


2,而且在 trig_sql表上面加入索引:
 create index  idx_time on plas.trig_sql (LT);
  
3。建立触发器
create or replace trigger pri_test
  after insert or update or delete on plas.aaa_test
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  IF inserting THEN
    INSERT INTO plas.trig_sql
        select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
               s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
               ‘INSERT’,
              sys_context(‘userenv’,’ip_address’)
          from v$sql q, v$session s
         where s.audsid=(select userenv(‘SESSIONID’) from dual)
           and s.prev_sql_addr=q.address
           AND s.PREV_HASH_VALUE = q.hash_value;
    COMMIT;
  ELSIF deleting  then
      INSERT INTO plas.trig_sql
           select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
                       s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
                       ‘DELETE’,
                       sys_context(‘userenv’,’ip_address’)
             from v$sql q, v$session s
            where s.audsid=(select userenv(‘SESSIONID’) from dual)
             and s.prev_sql_addr=q.address
             AND s.PREV_HASH_VALUE = q.hash_value;
    COMMIT;
  ELSIF updating then
    INSERT INTO plas.trig_sql
         select sysdate,s.SID, s.SERIAL#, s.USERNAME, s.OSUSER,
                     s.MACHINE, s.TERMINAL, s.PROGRAM, q.sql_text line,
                     ‘UPDATE’,
                     sys_context(‘userenv’,’ip_address’)
           from v$sql q, v$session s
          where s.audsid=(select userenv(‘SESSIONID’) from dual)
           and s.prev_sql_addr=q.address
           AND s.PREV_HASH_VALUE = q.hash_value;
    COMMIT;
   END IF;
END;

4,開始进行数据操作測试:
           insert into plas.aaa_test1 select 2,’tom’,sysdate from dual;
           update plas.aaa_test1 a set a.name=’tom_up’ where a.id=2;
  update plas.aaa_test a set a.name=’tom_up1′ where a.id=1;
……
           commit;


5,去查看表记录,会发现例如以下
SQL> select * from plas.trig_sql;
LT                 SID    SERIAL# USERNAME                       OSUSER                                                           MACHINE                          TERMINAL         PROGRAM                                                          SQLTEXT                                                                          STATUS                         CLIENT_IP
———– ———- ———- —————————— —————————————————————- ——————————– —————- —————————————————————- ——————————————————————————– —————————— ————————————————————
2014/10/29        1273      33297 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     INSERT                         192.168.170.180
2014/10/29        1273      33297 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     DELETE                         192.168.170.180
2014/10/29        1273      33297 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     INSERT                         192.168.170.180
2014/10/29        1352      40155 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     INSERT                         192.168.170.180
2014/10/29        1273      33297 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     UPDATE                         192.168.170.180
2014/10/29        1273      33297 POWERDESK                      Administrator                                                    WORKGROUP\WIN-18P5Q5AREH9        WIN-18P5Q5AREH9  plsqldev.exe                                                     begin :id := sys.dbms_transaction.local_transaction_id; end;                     UPDATE                         192.168.170.110
2014/10/29          25      39527 SYS                            oracle                                                           localhost.localdomain            pts/1            sqlplus@localhost.localdomain (TNS V1-V3)                        update plas.aaa_test a set a.name=’tom_update’ where id=2                        UPDATE                         
2014/10/29          25      39527 SYS                            oracle                                                           localhost.localdomain            pts/1            sqlplus@localhost.localdomain (TNS V1-V3)                        update plas.aaa_test a set a.name=’tom_update3′ where id=3                       UPDATE                         
8 rows selected


SQL> 


PS:看到SQLTEXT有些都为   begin :id := sys.dbms_transaction.local_transaction_id; end; 的,是由于我运行的insert、delete、update语句在plsqldev.exe客户端运行的,所以没有记录下运行的sql语句。而有些通过sqlplus@localhost.localdomain (TNS V1-V3)客户端连接运行的,会记录下运行过的update语句。


6。统计下当前都有哪些用户以及ip运行了dml操作。


SQL> select username,client_ip from plas.trig_sql group by username,client_ip;
USERNAME                       CLIENT_IP
—————————— ————————————————————
PLAS                           192.168.170.180
DESKER                         192.168.170.110


SQL> 


Oracle 11G CRUD操作监控单个表—————————————————————————————————————-

<版权全部,文章同意转载。但必须以链接方式注明源地址,否则追究法律责任!>
原博客地址:   http://blog.itpub.net/26230597/viewspace-1312184/
原作者:黄杉 (mchdba)

Oracle 11G CRUD操作监控单个表—————————————————————————————————————-


參考文章:
http://blog.csdn.net/edcvf3/article/details/7865688

http://blog.itpub.net/29320885/viewspace-1158915/


版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117689.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • eclipse集成svn使用_svn常用命令

    eclipse集成svn使用_svn常用命令在新版本的Eclipse中是没有svn这个插件,如果我们要用,不得不自己去集成SVN(我不知道老版当中有没有这个插件,没太注意这个问题),今天给大家带来2种集成的方式,一种是在线集成,另一种否是离线集成。这也是我目前知道的2种方案,我也不清楚还有没有其它方案。1.在线集成:Name:这个可以任意添,没有硬性规定,最好见名知意。Location:http://subclipse.tigris.org…

    2022年9月26日
    3
  • C++虚函数详解

    C++虚函数详解C++虚函数详解前言C++的特性使得我们可以使用函数继承的方法快速实现开发,而为了满足多态与泛型编程这一性质,C++允许用户使用虚函数**(virtualfunction)来完成运行时决议这一操作,这与一般的编译时决定**有着本质的区别。虚函数表实现原理虚函数的实现是由两个部分组成的,虚函数指针与虚函数表。虚函数指针虚函数指针**(virtualfunctionpointer)*…

    2022年7月26日
    8
  • maven阿里云仓库配置_阿里docker仓库

    maven阿里云仓库配置_阿里docker仓库maven仓库1、阿里云maven仓库https://mvnrepository.com/artifact/com.aliyun2、仓库配置第一步:修改maven根目录下的conf文件夹中的setting.xml文件,内容如下:<mirrors><mirror><id>alimaven</id>&lt…

    2025年6月17日
    5
  • python 字符串去空格

    python 字符串去空格一、去除字符串空格,在Python里面有它的内置方法lstrip:删除左边的空格这个字符串方法,会删除字符串s开始位置前的空格。>>>s.lstrip()’string’rstrip:删除右连的空格这个内置方法可以删除字符串末尾的所有空格,看下面演示代码:>>>s.rstrip()’string’strip:删除两端的空格有的时候我们读取文件中的内容,每行2边都有空

    2022年5月28日
    40
  • C语言小游戏(flappy bird),附带源码及素材

    C语言小游戏(flappy bird),附带源码及素材课程设计 用 C 语言编码一个小游戏 flappybird 前言一 系统简介二 函数模块图三 具体代码头文件前言完成该程序需要用到 easy x 库数据 建议用 vc6 或 vs2013 版本以上等支持安装 easy x 库的软件一 系统简介该游戏名为 FLIP 滑稽 改自 flappybird 游戏实现了按空格键跳跃 越过障碍无得分 触碰障碍物边界或游戏窗口上下边界游戏结束的功能 其中图片 音效 文件写入

    2025年9月20日
    6
  • .NET/C#发起GET和POST请求的几种方法

    .NET/C#发起GET和POST请求的几种方法

    2021年6月13日
    133

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号