使用stream实现DML的审计功能
Dear All:
Hi. 当前环境:Window XP + Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
最近遇到一个需求如下:
Schema的表的DML操作记录到日志表。(例如:update t set col1 = col1+5 )。
记录到日志的信息包括: 当前用户名:schema name,DML操作类型:update,DML操作的具体列名:col1 等等。
因为DML操作的列是动态的,所以考虑使用stream的capture来捕获DML的信息。
1、已经配置stream的帐号 strmadmin
2、strmadmin 已正确授权
3、需捕获DML的schema为scott
一、登入strmadmin
1、建立队列
begin
dbms_streams_adm.set_up_queue(
queue_table => 'prod_queue_table',
queue_name => 'prod_queue',
queue_user => 'strmadmin');
end;
2、创建capture进程
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'scott',
streams_type => 'capture',
streams_name => 'capture_prod',
queue_name => 'strmadmin.prod_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => null,
inclusion_rule => true);
end;
3、创建apply进程
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'scott',
streams_type => 'apply',
streams_name => 'apply_prod',
queue_name => 'strmadmin.prod_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => null,
inclusion_rule => true);
end;
4、启动capture进程
begin
dbms_capture_adm.start_capture(capture_name => 'capture_prod');
end;
5、启动apply进程
begin
dbms_apply_adm.start_apply(apply_name => 'apply_prod');
end;
6、设置DML操作的Handler
begin
dbms_apply_adm.set_dml_handler(
object_name => 'scott.dept',
object_type => 'TABLE',
operation_name => 'UPDATE',
error_handler => false,
user_procedure => 'strmadmin.dml_handler',
apply_database_link => null);
end;
问题1:
在步骤6中的 “user_procedure => 'strmadmin.dml_handler' ”。
我已经在strmadmin中建立了一个存储过程dml_handler,用来处理scott的dept的DML操作(UPDATE操作)。
测试中,对scott的dept表,进行UPDATA操作后,发现dml_handler没有被调用。
在dml_handler中使用dbms_output.putline('procedure had been fired!');
发现控制台并未打印出该条信息。
问题2:
在启动apply进程后,查看状态。
SELECT apply_name, apply_captured, status FROM dba_apply;
发现该进程状态为aborted.
请教大家:上面设置capture和apply的过程,是否正确。不甚感激。
Hi. 当前环境:Window XP + Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
最近遇到一个需求如下:
Schema的表的DML操作记录到日志表。(例如:update t set col1 = col1+5 )。
记录到日志的信息包括: 当前用户名:schema name,DML操作类型:update,DML操作的具体列名:col1 等等。
因为DML操作的列是动态的,所以考虑使用stream的capture来捕获DML的信息。
1、已经配置stream的帐号 strmadmin
2、strmadmin 已正确授权
3、需捕获DML的schema为scott
一、登入strmadmin
1、建立队列
begin
dbms_streams_adm.set_up_queue(
queue_table => 'prod_queue_table',
queue_name => 'prod_queue',
queue_user => 'strmadmin');
end;
2、创建capture进程
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'scott',
streams_type => 'capture',
streams_name => 'capture_prod',
queue_name => 'strmadmin.prod_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => null,
inclusion_rule => true);
end;
3、创建apply进程
begin
dbms_streams_adm.add_schema_rules(
schema_name => 'scott',
streams_type => 'apply',
streams_name => 'apply_prod',
queue_name => 'strmadmin.prod_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => null,
inclusion_rule => true);
end;
4、启动capture进程
begin
dbms_capture_adm.start_capture(capture_name => 'capture_prod');
end;
5、启动apply进程
begin
dbms_apply_adm.start_apply(apply_name => 'apply_prod');
end;
6、设置DML操作的Handler
begin
dbms_apply_adm.set_dml_handler(
object_name => 'scott.dept',
object_type => 'TABLE',
operation_name => 'UPDATE',
error_handler => false,
user_procedure => 'strmadmin.dml_handler',
apply_database_link => null);
end;
问题1:
在步骤6中的 “user_procedure => 'strmadmin.dml_handler' ”。
我已经在strmadmin中建立了一个存储过程dml_handler,用来处理scott的dept的DML操作(UPDATE操作)。
测试中,对scott的dept表,进行UPDATA操作后,发现dml_handler没有被调用。
在dml_handler中使用dbms_output.putline('procedure had been fired!');
发现控制台并未打印出该条信息。
问题2:
在启动apply进程后,查看状态。
SELECT apply_name, apply_captured, status FROM dba_apply;
发现该进程状态为aborted.
请教大家:上面设置capture和apply的过程,是否正确。不甚感激。
...全文
相关推荐
oracle Stream
2.高级队列技术:Oracle Stream 使用高级队列技术来实现数据库之间的同步,该技术可以确保数据的一致性和可靠性。
Oracle Stream配置详细步骤
Oracle Stream利用高级队列技术通过解析归档日志的方式将归档日志解析成数据定义语言(DDL)和数据操作语言(DML)语句,进而实现对数据的同步。
Oracle Stream-安装配置
Streams利用了Oracle的高级队列技术,通过解析归档日志,将数据库的DDL(数据定义语言)和DML(数据操纵语言)转换为可执行的语句,以实现在不同数据库间的同步。
Oracle_Stream_深入探讨
Simple Oracle Stream 是Oracle Stream的一个基本实现,主要由以下四个关键过程组成:1.
Oracle Stream + AQ + JMS 搭建步骤
#### 五、总结通过上述步骤,我们可以实现Oracle Stream + AQ + JMS的数据同步方案。


