Oracle Trigger将所有插入/更新写入文件

时间:2012-01-10 11:26:39

标签: sql oracle triggers

我想在一个表上放置一个触发器,该表将所有插入/更新的数据写入另一个日志文件,以便使用外部工具进行处理。

这是实现这个目标的方法吗?

3 个答案:

答案 0 :(得分:5)

您需要创建在更改表行后执行的触发器,并使用UTL_FILE包写入日志文件。

可在此处找到UTL_FILE包信息: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm

可以在此处找到触发器文档: http://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg13trg.htm

您在寻找的内容有类似的答案: http://bytes.com/topic/oracle/answers/762007-trigger-output-text-file

有关使用PL / SQL写入文件的更多信息: http://www.devshed.com/c/a/Oracle/Writing-to-Text-Files-in-Oracle-PLSQL/

希望它有所帮助...

答案 1 :(得分:2)

我会避免在DML时写入文件系统,但会在每晚(或任何频率)批处理中提取数据。

从您的OP中,不清楚更新后是否需要“新”数据,或更新前需要“旧”数据。如果您只想要最新数据,为什么不只是添加modified_date字段(日期或时间戳类型)并通过触发器更新它。

create table test
(
id number,
val varchar2(100),
modified_date date  default sysdate not null
)
;

CREATE OR REPLACE TRIGGER TR_TEST_BU
BEFORE UPDATE
ON TEST REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
begin
  :new.modified_date := sysdate;
end;

insert into test(id, val) values (1, 'Insert 1');
commit;

select * from test;

exec dbms_lock.sleep(5);
update test set val = 'Update 1' where id = 1;
commit;

select * from test;

如果您在更新之前需要旧数据(或者您关心已删除的数据),那么您将修改触发器以将旧的或已删除的值写入历史表,然后从那里提取数据。

另请注意,向表中添加触发器会降低关联的DML活动速度。一些商店希望通过用业务逻辑规则(“所有应用程序必须更新modifed_date”法令)替换触发器来避免这种情况,这通常会导致与我所见的数据不一致(或更糟)。

答案 2 :(得分:1)

是的,here您有一个update部分的示例。

您只需要对insert部分执行类似的操作。

相关问题