[Oracle] 利用自治事务实现审计功能
在一个事务(外层事务)中可以定义一个或几个自治事务。自治事务可以独立commit,不对外层事务产生影响,同样外层事务的 rollback
在一个事务(外层事务)中可以定义一个或几个自治事务。自治事务可以独立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表插入数据的事务正常回滚,而审计自治事务不回滚。

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

The article discusses using MySQL's ALTER TABLE statement to modify tables, including adding/dropping columns, renaming tables/columns, and changing column data types.

Article discusses configuring SSL/TLS encryption for MySQL, including certificate generation and verification. Main issue is using self-signed certificates' security implications.[Character count: 159]

Article discusses strategies for handling large datasets in MySQL, including partitioning, sharding, indexing, and query optimization.

Article discusses popular MySQL GUI tools like MySQL Workbench and phpMyAdmin, comparing their features and suitability for beginners and advanced users.[159 characters]

The article discusses dropping tables in MySQL using the DROP TABLE statement, emphasizing precautions and risks. It highlights that the action is irreversible without backups, detailing recovery methods and potential production environment hazards.

Article discusses using foreign keys to represent relationships in databases, focusing on best practices, data integrity, and common pitfalls to avoid.

The article discusses creating indexes on JSON columns in various databases like PostgreSQL, MySQL, and MongoDB to enhance query performance. It explains the syntax and benefits of indexing specific JSON paths, and lists supported database systems.

Article discusses securing MySQL against SQL injection and brute-force attacks using prepared statements, input validation, and strong password policies.(159 characters)
