`
lizhiyu211
  • 浏览: 230517 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle监控sql语句对表的操作

阅读更多

oracle 9i/10g关于执行sql语句的监控

有的时候由于某种原因,我们需要监控对某个表的操作,例如:某个字段总是被莫名其妙的修改,此时就需要监控执行该操作的sql语句和操作人等信息,针对这种情况,9i和10g各有自己的监控方式。

1、oracle 9i
9i可以创建一个表,记录监控过程中感兴趣的东西


SQL> create table zk.monitor_sql(
 username        varchar2(30),
 client_ip       varchar2(100),
 sql_text        varchar2(4000),
 table_name      varchar2(30),
 owner           varchar2(30)
 );

 然后创建一个触发器,来监控对监控对象的操作:

 


 CREATE OR REPLACE TRIGGER trigger_monitor_update_sql
 BEFORE UPDATE ON zk.cm_busi_handle_200903
 declare
          n                number;
          stmt             varchar2(4000);
          sql_text         ora_name_list_t;
 begin
      dbms_output.put_line(ora_sql_txt(sql_text));
          n := ora_sql_txt(sql_text);
          IF nvl(n,200)=200 THEN
             raise_application_error(-20001,'ora_sql_txt未捕捉到任何语句.sql_txt未初始化');
          ELSE FOR i IN 1..n LOOP
                    stmt := stmt || sql_text(i);
            END LOOP;
            dbms_output.put_line(stmt);
          END IF;
 
          insert into zk.monitor_sql(USERNAME, CLIENT_IP, SQL_TEXT, TABLE_NAME, OWNER)
          values(user,sys_context('userenv','ip_address'),stmt,'T1','RAINY');
 end;
/

 

 

这样,执行对表zk.cm_busi_handle_200903的update操作的用户名、ip地址、sql语句等信息就会保存在zk.monitor_sql表里了。其中关键的一步是:
ora_sql_txt(sql_text)

原型:ora_sql_txt(sql_text out ora_name_list_t)
官方解释:Returns the SQL text of the triggering statement in the OUT parameter. If the statement is long, it is broken into multiple PL/SQL table elements. The function return value shows the number of elements are in the PL/SQL table

但是ora_sql_txt(sql_text)只有在9i版本允许在dml触发器使用,在10g后该函数总是返回空,据说只能在ddl触发器使用。针对这一点的说法是:
On database versions 9.2.0.1 to 9.2.0.6 ora_sql_text works and returns the calling text for dml triggers, where as starting from 9.2.0.7 the behavior has changed and returns NULL.

2、oracle 10g


说是10g,9i应该也可以。其实我们可以结合v$session和v$sqltext来查看对某个表的操作,也可以采取如下的方式,创建一个策略:


 begin
 dbms_fga.add_policy(object_schema => 'zk', --schema名(默认当前操作用户)
                      object_name => 'cm_busi_handle_200903',       --被操作object对象
                      policy_name => 'cm_busi_audit', --policy名(唯一)
                      audit_condition => 'process_id = 1', --条件
        audit_column => 'oper_date', --列,如果有两个以上用“,”分隔
                      statement_types => 'update', --受影响的操作,如果有两个以上用“,”分隔
                      enable=>TRUE   );
 end;

 

 

查看捕获策略
select * from dba_audit_policies;

查看捕获信息
select timestamp,userhost,os_user,db_user,object_schema,object_name,statement_type,sql_text,policy_name from dba_fga_audit_trail order by timestamp;

策略的删除:

exec dbms_fga.drop_policy(object_schema=>'zk', object_name => 'cm_busi_handle_200903',policy_name => 'cm_busi_audit');
PL/SQL procedure successfully completed 

 

 

 

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Phoenix_99/archive/2011/03/04/6223612.aspx

分享到:
评论

相关推荐

    Oracle性能监控SQL语句

    ### Oracle性能监控SQL语句详解 #### 一、分析表 **知识点:** - **Table Analysis:** - 使用`ANALYZE TABLE`命令来收集表及其索引的统计信息,这对于优化器做出正确的执行计划决策至关重要。 - `ANALYZE ...

    Oracle数据库sql语句的基本操作详解

    本文将深入解析Oracle SQL语句的基本操作,帮助初学者更好地理解和应用这些技巧,从而提高数据库查询效率。 首先,理解选择最有效率的表名顺序至关重要。在FROM子句中,Oracle会按照从右到左的顺序处理表,这意味着...

    学生成绩管理系统Oracle全部SQL语句.txt

    (1)选定某一主题,创建一个oracle数据库,对其进行日常管理及应用(全部用SQL语句实现): 1、创建数据库实例,数据库表空间,创建管理员,普通用户,并分别授予相应权限; 2、至少建立5个表,以及表间关系,使用...

    数据库 创建索引 sql oracle

    "数据库创建索引SQL Oracle" 数据库索引是数据库性能优化的重要手段之一。创建索引可以提高查询速度,降低数据库的负载,提高数据的安全性。本文将详细介绍数据库创建索引的原则、分类、创建方法、管理和优化等方面...

    ORACLE数据库SQL语句编写优化总结.zip

    本资料“ORACLE数据库SQL语句编写优化总结”深入探讨了如何有效地编写和优化SQL语句,以达到最佳的查询效率。 1. **理解执行计划** - **执行计划**是Oracle解析SQL语句后确定的数据获取策略,了解执行计划可以帮助...

    ORACLE优化SQL语句,提高效率

    Oracle在执行SQL语句时会进行多项内部操作,如解析语句、估算索引利用率、绑定变量、读取数据块等。为了提高性能,应尽可能减少这些操作的次数。例如,可以通过合并多个查询为一个复合查询来减少不必要的数据库访问...

    ORACLE常用SQL语句大全.docx

    本文档总结了 ORACLE 中常用的 SQL 语句,包括创建数据库、删除数据库、备份数据库、创建表、删除表、增加列、删除列、添加主键、创建索引、创建视图等基本操作。同时,也涵盖了高级查询运算符,如 UNION、EXCEPT、...

    Oracle数据库SQL语句性能调整

    Oracle数据库通过使用索引来加快对表的遍历,但SQL语句的编写方式直接影响到优化器是否能够有效利用这些索引。 首先,对于`IS NULL`和`IS NOT NULL`的操作,Oracle优化器并不支持在where子句中使用索引。这意味着...

    基于Oracle数据库的SQL语句优化

    ### 基于Oracle数据库的SQL语句优化 #### 引言 Oracle数据库是由甲骨文公司开发的一款关系型数据库管理系统,在当前的数据库市场中占据着重要的地位。它广泛应用于商业、政府等领域,具备强大的数据处理能力和高效...

    ORACLE数据库SQL语句编写优化总结.doc

    Oracle数据库SQL语句的编写和优化对于提升数据库性能至关重要。以下是对这些优化策略的详细解释: 1、**选用适合的Oracle优化器**:Oracle数据库有多种优化器,如成本基于的优化器(CBO)和规则基于的优化器(RBO)...

    oracle查看系统对象sql语句

    ### Oracle 查看系统对象 SQL 语句 在Oracle数据库中,了解如何查看各种系统对象对于数据库管理...通过上述SQL语句,我们可以全面地了解Oracle数据库中的系统对象信息,这对于日常的数据库管理和开发工作非常有帮助。

    ORACLE数据库SQL语句编写优化总结[借鉴].pdf

    Oracle数据库的SQL语句优化是提升数据库性能的关键环节,它涉及到多个方面,包括查询规划、数据访问策略、语句简洁性以及事务管理等。以下是对这些优化策略的详细阐述: 1. **选用适合的ORACLE优化器**:Oracle...

    ORACLE-SQL优化

    执行计划是ORACLE为每个SQL语句生成的具体操作步骤。理解执行计划对优化至关重要,它包括对表的访问方法、连接类型、数据过滤等信息的展示。优化者可以通过EXPLAIN PLAN语句来获取SQL语句的执行计划,并使用DBMS_...

    oracle_sql性能优化 文档

    ORACLE支持SQL语句的共享,解析后的语句存储在SGA的共享池中,供所有用户共享,避免重复解析,提高执行效率。但是,只有完全相同的SQL语句(包括空格、换行等)才能共享。此外,共享语句的条件包括: - 字符级比较...

    oracle一条sql语句分页

    需要注意的是,ROWNUM的计算是在SQL语句执行的过程中完成的,并且一旦为某一行分配了ROWNUM值后,这个值就不会再改变。这意味着,即使对表进行排序操作,ROWNUM的值也不会受到影响。 #### 2. 使用 ROWNUM 实现简单...

    Oracle高级sql学习与练习

    3. WITH子句,又称为公用表表达式(Common Table Expressions,CTE),提供了一种定义临时结果集的方法,可以在查询中多次引用,简化了复杂的SQL语句。 4. MERGE语句用于将一个查询结果集与另一个表或查询结果集...

    写出高性能SQL语句的35条方法

    以上策略不仅适用于Oracle数据库,也广泛适用于其他关系型数据库管理系统,是提高SQL语句性能、优化数据库操作的关键实践。通过对这些技巧的熟练掌握和应用,可以显著提升数据处理的效率和数据库的整体性能。

Global site tag (gtag.js) - Google Analytics