Oracle中利用自治事务实现审计功能

在一个事务(外层事务)中可以定义一个或几个自治事务。自治事务可以独立commit,不 对外层事务产生影响,同样外层事务的 rollback 也对自治事务没有影响。

假设现在 有这样一个需求,不能对某个表进行某些操作(如更新),一旦有这类操作,就强制整个回 滚,并且在审计日志中记录该次违规操作。现在的问题是当事务回滚之后,日志中的记录也 会跟着被回滚,这时就可以利用自治事务来防止这个问题。

首先,定义日志表,用于 审计。

create table error_logs(
  id number(10)  not null,
  log_timestamp  timestamp  not null,
  error_message  varchar2(4000)
);  

create sequence error_log_seq;

创建一个自治事务的存储过程(关键字PRAGMA AUTONOMOUS_TRANSACTION代表自治事务),用于向审计表插入错误信息

create or 

replace procedure log_errors(p_error_message IN varchar2) as
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  insert into error_logs (id, log_timestamp, error_message)
  values (error_log_seq.NEXTVAL, systimestamp, p_error_message);
  commit;
END;
/

创建一个测试表,定义该表的ID字段不为空

create table at_test(
  id number(10) not null,
  des varchar2(200)
);

定义一个存储过程,尝试向测试表中插入非法数据

create or replace 

procedure p1 as
BEGIN
  insert into at_test (id, des)
  values (1, 'desc1');
  insert into at_test (id, des)
  values (NULL, 'desc2');
EXCEPTION
  WHEN OTHERS THEN
    log_errors (p_error_message => SQLERRM);
    rollback;
END;
/

执行这个存储过程,查看是否审计成功

SQL> exec p1  

PL/SQL 过程已成功完成。  

SQL> select * from at_test;  

未选定行  

SQL> select * from error_logs;  

        ID LOG_TIMESTAMP                    ERROR_MESSAGE
---------- -------------------------------- ------------------------------------

-------------------
         2 28-5月 -13 03.34.51.210000 下午   ORA-01400: 无法将 NULL 插入 

("TEST"."AT_TEST"."ID")

从上面的结果可以发现,向at_test表插入数据的事务正 常回滚,而审计自治事务不回滚。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索存储过程
, 事务
, varchar2
, create
, 审计
, 一个
error_log
oracle自治事务、oracle 自治事务处理、合肥有哪些审计事务所、南宁会计事务所审计、审计师事务所,以便于您获取更多的相关知识。

时间: 2024-09-11 20:18:55

Oracle中利用自治事务实现审计功能的相关文章

ASP.NET中利用DataGrid的自定义分页功能

asp.net|datagrid|分页 ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页 ASP.Net中的DataGrid有内置分页功能, 但是它的默认的分页方式效率是很低的,特别是在数据量很大的时候,用它内置的分页功能几乎是不可能的事,因为它会把所有的数据从数据库读出来再进行分页, 这种只选取了一小部分而丢掉大部分的方法是不可去取的. 在最进的一个项目中因为一个管理页面要管理的数据量非常大,所以必须分页显示,并且不能用DataGrid的内置分页功能,于是自己实现

Oracle中利用存储过程建表

Oracle中存储过程不可以执行DDL语句,但是我们可以利用动态sql语句来建立表格. 如下:   代码 create or replace procedure spCreateTestTableis    v_CreateString varchar2(1000);begin    declare        v_count number;    begin        v_count := 0;                select count(*)        into v_c

Oracle中利用数据泵导出查询结果(二) 外部表的卸载功能

还是上一篇中的测试环境: SQL> CREATE TABLE T1 2  (ID NUMBER, NAME VARCHAR2(30)); Table created. SQL> INSERT INTO T1 2  SELECT ROWNUM, TNAME 3  FROM TAB; 66 rows created. SQL> CREATE TABLE T2 2  (ID NUMBER, NAME VARCHAR2(30)); Table created. SQL> INSERT IN

Oracle中利用数据泵导出查询结果(一) 数据泵的QUERY功能

在ITPUB上看到有人提出这个问题,能否利用数据泵导出一个查询结果.事实上数据泵还真的具有这个功能. 建立一个简单的测试环境: SQL> CREATE TABLE T1 2  (ID NUMBER, NAME VARCHAR2(30)); Table created. SQL> INSERT INTO T1 2  SELECT ROWNUM, TNAME 3  FROM TAB; 66 rows created. SQL> CREATE TABLE T2 2  (ID NUMBER, N

Oracle中会话与事务的区别

一个会话可以启动多个事务,会话是session,指一次连接. 事务是指一个操作单元,要么成功,要么失败,没有中间状态. 会话中可以完成多个事务. 例如: 会话好比,在应用程序中连接数据库要执行连接,然后会关闭,这算一次会话. 事务呢,就好比在打开会话后要执行程序中的某一个或多个对数据库进行的操作. 事物的最好例子就是转账,从一个账户赚钱到另一个账户,两张表的数据修改,要么全成功,要门全变回原样. 会话看 v$session 事务看 v$transaction 这两张视图通过 v$session.

Oracle中利用DETERMINISTIC声明提高性能(一) ARRAY对性能的影响

虽然Oracle提供的DETERMINISTIC声明,本意是确保函数的确定性,但是如何合理利用,是可以用来提高性能的. 这一篇描述ARRAY对性能的影响. 关于DETERMINISTIC函数,以前已经写过一些文章了,不过对于DETERMINISTIC声明用来提高性能只是简单提了一句,并没有展开来说. 由于函数声明了DETERMINISTIC特性,Oracle对于相同的输入,可以只运行一次,而这对于代码比较复杂,调用时间较长的函数而言,确实可以提高性能. 但是在上面的几篇文章中也提到了,DETER

在Oracle中利用REDO实现故障恢复

在数据库中,Redo的功能主要通过3个组件来实现:Redo Log Buffer.LGWR后台进程和Redo Log File (在归档模式下,Redo Log File最终会写出为归档日志文件). 在Oracle的SGA中,存在一块共享内存,称为Redo Log Buffer,如图1所示. 图1 Oracle Instance Redo Log Buffer位于SGA之中,是一块循环使用的内存区域,其中保存数据库变更的相关信息.这些 信息以重做条目(Redo Entries)形式存储(Redo

如何在win7旗舰版中利用组策略删除注销功能?

  w764位旗舰版的关机方法想必大家是十分了解的吧,当很多用户升级到win8系统之后还会觉得非常的不习惯,因为win8系统的关机功能十分的"封闭",和之前win7旗舰版中的方便操作似乎形成了鲜明的对比,那么大家在win旗舰版的关机功能这里是否有发现这里还有其他的功能呢?大家不妨点击出来看看,这里出了关机之外,还有注销.休眠.待机等选择模式,其中是不是有一些似乎是你不曾使用到的?如果你也举得这些功能十分的麻烦的话,那么下面,小编就来讲述一下,如何利用win7旗舰版中的组策略操作来删除掉

Oracle中利用哈希函数提高查询速度

oracle|函数|速度 当数据存储在一个普通表中的时候,这些记录将以插入到数据库时的顺序物理地保存到分配的块中.例如,如果有一个用于存储员工信息的表,那么员工姓名将会按照插入到表的顺序存储在表中. 如果员工记录非常多的话,那么数据表的响应速度就会逐渐变慢.你可以通过选择值相对等分布的一列(如员工的部门编号)并建立一个簇表来提高查询员工的速度. 在簇表中,如果员工属于同一个部门,那么它们的记录将物理地存储在同一系列的块中.这样就可以提高查找员工信息的速度,这是因为在检索某个特定部门的员工时,需要