[20140529]使用审计记录一些不能DML的记录

[20140529]使用审计记录一些不能DML的记录.txt

--前几天看了审计的一些内容,突然想起多年以前一直困扰我的问题。

--生产系统存在一个问题,就是录入信息存在大于的信息超出范围的问题,出现这个问题,主要是程序存在单位的转换,
--比如是mg的单位,开成了g的单位。这样在转化的过程中出现溢出情况,本来这些问题应该有程序来解决,可惜开发
--一直不去纠正这个问题,我们的做法是要求用户选取一段记录来保存,或者逐条保存.显然这样效率不高,用户抱怨不断.
--实际上我对这样的开发团队非常失望!

--我本来考虑通过触发器来判断,实际上根本不可行,具体细节我已经忘记。今天看了一下11G的审计,突然想到一个更
--简单的方法,做一个例子:

SYS@test> show parameter audit_trail
NAME                                 TYPE                                     VALUE
------------------------------------ ---------------------------------------- ---------
audit_trail                          string                                   DB

--因为要记录修改的sql语句,必须加入EXTENDED,遇到一点小插曲,可以参考链接:
http://blog.itpub.net/267265/viewspace-1172182/

SYS@test> alter system set audit_trail=db,extended scope=spfile ;
System altered.

--必须重启在生效!
SYS@test> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

SYS@test> show parameter audit_trail
NAME                                 TYPE                                     VALUE
------------------------------------ ---------------------------------------- --------------
audit_trail                          string                                   DB, EXTENDED

SCOTT@test01p> create table dept1 as select * from dept;
Table created.

SCOTT@test01p> @desc dept1 ;
Name                    Null?    Type
----------------------- -------- ----------------
DEPTNO                           NUMBER(2)
DNAME                            VARCHAR2(14)
LOC                              VARCHAR2(13)

SCOTT@test> insert into dept1 values (100,'a','b');
insert into dept1 values (100,'a','b')
                          *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

--100超出了范围,出现ora-01438错误.当然可以建立这样的事件来跟踪问题.
--缺点比如ora-00001也要另外写一个事件.

--SQL> alter system set events='1438 trace name Errorstack forever,level 10';

--选取不成功的insert作为记录,这样记录就很少,不会太多,对系统影响也最小.
SCOTT@test> audit insert on dept1 whenever not successful;
Audit succeeded.

SCOTT@test> insert into dept1 values (140,'a','b');
insert into dept1 values (140,'a','b')
                          *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

SCOTT@test> select sql_text,sql_bind,returncode from dba_audit_trail where owner=user and obj_name='DEPT1';
SQL_TEXT                                                     SQL_BIND                                           RETURNCODE
------------------------------------------------------------ -------------------------------------------------- ----------
insert into dept1 values (140,'a','b')                                                                                1438

--插入绑定变量看看:
SCOTT@test> var n number;
SCOTT@test> exec :n :=100;
PL/SQL procedure successfully completed.

SCOTT@test> insert into dept1 values (:n,'a','b');
insert into dept1 values (:n,'a','b')
                           *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column

SCOTT@test> select sql_text,sql_bind,returncode from dba_audit_trail where owner=user and obj_name='DEPT1';
SQL_TEXT                                                     SQL_BIND                                           RETURNCODE
------------------------------------------------------------ -------------------------------------------------- ----------
insert into dept1 values (:n,'a','b')                         #1(3):100                                               1438
insert into dept1 values (140,'a','b')                                                                                1438

--建立主键:
create unique index pk_dept1 on scott.dept1 (deptno);
alter table dept1 add constraint pk_dept1  primary key (deptno);

SCOTT@test> exec :n :=10;
PL/SQL procedure successfully completed.

SCOTT@test> insert into dept1 values (:n,'a','b');
insert into dept1 values (:n,'a','b')
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_DEPT1) violated

SCOTT@test> select sql_text,sql_bind,returncode from dba_audit_trail where owner=user and obj_name='DEPT1';
SQL_TEXT                                                     SQL_BIND                                           RETURNCODE
------------------------------------------------------------ -------------------------------------------------- ----------
insert into dept1 values (:n,'a','b')                         #1(2):10                                                   1
insert into dept1 values (:n,'a','b')                         #1(3):100                                               1438
insert into dept1 values (140,'a','b')                                                                                1438

-- 很明显使用这种方式定位错误的记录效果更好.
-- 注意一个问题就是这种审计使用的是自治事务,即使你rollback,也会记录下来,要注意这些细节。

--补充字符串超出范围的例子:
SCOTT@test> variable c1 varchar2(20);
SCOTT@test> exec :c1 :='aaaaaaaaaaaaaaaaaaa' ;
PL/SQL procedure successfully completed.

SCOTT@test> insert into dept1 values (1,:c1,'b');
insert into dept1 values (1,:c1,'b')
                             *
ERROR at line 1:
ORA-12899: value too large for column "SCOTT"."DEPT1"."DNAME" (actual: 19, maximum: 14)

SCOTT@test> select sql_text,sql_bind,returncode from dba_audit_trail where owner=user and obj_name='DEPT1';
SQL_TEXT                                                     SQL_BIND                                           RETURNCODE
------------------------------------------------------------ -------------------------------------------------- ----------
insert into dept1 values (1,:c1,'b')                          #1(19):aaaaaaaaaaaaaaaaaaa                             12899

时间: 2024-10-03 07:19:54

[20140529]使用审计记录一些不能DML的记录的相关文章

【MySQL】再说MySQL中的 table_id

[背景] 最近线上一个实例出现了主从数据不一致的情况,也即从库丢失数据的情况.根本原因:"由于table_list->table_id为uint,而m_table_id为ulong,主库上assign的table map id 总是一直递增的 当超过2^32后,备库出现溢出,导致row模式下备库对应table id的事件全部丢失,产生主备不一致." [问题分析]一 table_id 介绍     当MySQL 开启日志模式时,binlog会记录所有对数据库的变更操作.binlog

使用logminer来分析对表所做的修改

使用logminer来分析对表所做的修改 1.设置初始化参数UTL_FILE_DIR 以指定一个允许 PL/SQL 文件 I/O 的目录 utl_file_dir='D:\oracle\log'; 2.执行 BMS_LOGMNR_D.BUILD 过程以创建字典文件 execute dbms_logmnr_d.build('ocp.ora','D:\oracle\log'); 指定要分析的日志文件 3.设置 V$LOGMNR_CONTENTS 视图: 初始化新列表并指定第一个日志文件 SQL> e

[MySQL学习] MySQL 5.6 improvement for troubleshooting

本文基于Sveta(Oracle的Principle Technical Support Engineer )的博文"My eighteen MySQL 5.6 favorite troubleshooting improvements",原文地址如下:https://blogs.oracle.com/svetasmirnova/entry/my_18_mysql_5_6 原文针对每个点介绍的比较粗略,这里会对内容做一些扩展,也是我看这篇博客时的笔记,聚合了查阅的相关资料   1.对U

《CCNA安全640-554认证考试指南》——6.2节保护管理流量

6.2 保护管理流量 CCNA安全640-554认证考试指南 如果根本没有意识到问题,修复问题更无从谈起.因此,本节会先对管理流量进行分类和描述,并指出管理流量的一些弱点.此外,本节也会介绍一些有助于保护管理流量的概念.接下来,本章会在稍后部分中介绍一些实施案例. 6.2.1 什么是管理流量,什么是管理层 在第一次拿到一台新的路由器或交换机时,需要通过一根蓝色的反转线将计算机和这台设备的控制台端口连接起来,以对其进行管理.这时首次出现管理流量这个概念.在默认情况下,连接控制台端口时,管理员不会看

PostgreSQL 9.4 logical replicatoin patch: logical changeset generation v5

PostgreSQL 的xlog逻辑解析补丁, 可以从xlog中解出数据库中执行的SQL, 但是从测试情况来看目前不支持DDL的解析, 只有DML的解析. 未来PostgreSQL可以基于此增加基于SQL复制的功能.  补丁比较多, 有些是单独提交的, 本文将简单的测试一下. 下载PostgreSQL源码, 注意最好使用补丁释放前一天的版本 :  http://git.postgresql.org/gitweb/?p=postgresql.git;a=snapshot;h=bab54e383dd

数据库内核月报 - 2015 / 05-MySQL · 捉虫动态 · 临时表操作导致主备不一致

bug描述 在binlog_format=row模式下,事务中create或drop临时表后,后面再执行DML(影响多行的DML)如果失败,那么失败的DML会回滚,但DML仍然记录了binlog.这个 binlog 应用到备库后会导致主备不一致. 此bug已提给官方bug#76940. 以下是重现的测例: 主库执行 create table t1(c1 int primary key) engine=innodb; insert into t1 values(1),(2),(3),(4),(5)

从商用到开源:DB2迁移至MySQL的最佳实践

身处数据驱动快速变革的时代,数据库系统的选型和架构设计对于整个IT基础架构,甚至企业的发展都起到至关重要的作用.那么今天,如果您的企业需要搭建一套新的应用系统,你会选择什么数据库类型?如果当前的系统不能满足业务需求,面临系统迁移,你又会如何选择? 在2017年初,我们分享过一份国外的报告"开发人员是如何使用数据库的 ",并且进行了一次调查『中国数据库爱好者的选择和背离』,其中的一些数据展示了用户对于数据库的选择,非常具有参考价值,链接可以直接参考分析报告. 随着互联网+时代的到来,企业

[20130312]undo与DML-update.txt

[20130312]undo与DML-update.txt 闲着没事,研究一下undo与DML. DML操作在UNDO中的信息 通过Dump UNDO Block观察到DML操作记录在UNDO中的信息,主要为以下内容:1.对于Insert操作,需要在UNDO中记录插入行的ROWID.2.对于Update操作,需要在UNDO中记录被更新列的前镜像,同时也会记录被更新行的ROWID.3.对于Delete操作,需要在UNDO中记录被删除行所有列的值(前镜像)及ROWID. 1.接着前面的测试继续测试u

[20130312]undo与DML-delete.txt

[20130312]undo与DML-delete.txt 闲着没事,研究一下undo与DML. DML操作在UNDO中的信息 通过Dump UNDO Block观察到DML操作记录在UNDO中的信息,主要为以下内容:1.对于Insert操作,需要在UNDO中记录插入行的ROWID.2.对于Update操作,需要在UNDO中记录被更新列的前镜像的值,同时也会记录被更新行的ROWID.3.对于Delete操作,需要在UNDO中记录被删除行所有列的值(前镜像)及ROWID. 1.接着前面的测试继续测