回答
您需要创建在表行更改后执行并使用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/
希望它有帮助...
正如@tbone所评论的那样,您可能需要考虑使用BEFORE触发器,因为它们比AFTER触发器更高效 - 从Oracle Docs:BEFORE行触发器比AFTER行触发器稍微高效。使用AFTER行触发器时,必须为触发器读取受影响的数据块(逻辑读取,而非物理读取),然后再次触发语句。或者,使用BEFORE行触发器时,触发语句和触发器的数据块只能读取一次。 – Ollie 2012-01-10 13:33:25
是的,here你有一个update
部分的例子。
你只需要做一个类似的insert
部分。
我会避免在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”edict)来避免这种情况,这通常会导致我看到的数据不一致(或更糟糕)。
- 1. Oracle SQL触发器插入/更新
- 2. Oracle触发器插入/更新
- 3. 插入后触发将所有行的副本写入审计文件
- 4. 触发器更新所有行,不只是插入
- 5. 触发更新插入
- 6. 更新触发器插入为空
- 7. 插入,更新,删除的触发器
- 8. 更新插入MSSql触发器(Updatecounter)
- 9. T-SQL触发器插入更新
- 10. 插入更新后的SQL触发器
- 11. 插入触发器更新后
- 12. sql触发器更新并插入
- 13. firebird - 插入或更新触发器后
- 14. Oracle触发器错误的更新和插入
- 15. Oracle在插入所有触发器之前
- 16. Oracle触发器无法识别插入
- 17. 插入后oracle触发器打印
- 18. 在表插入创建Oracle触发器
- 19. SQL触发器更新为大写不能使用SQLBulkCopy插入
- 20. 当另一个表插入或更新时,Oracle触发器更新一个表
- 21. 插入更新触发器如何确定是否插入或更新
- 22. Sql Server 2005 - 插入更新触发器 - 获取更新,插入行
- 23. 如何调试插入/更新触发器来查看插入/更新的值
- 24. 插入多行时,触发器不会触发所有行SQL
- 25. 如何在每次插入后触发触发器 - Oracle(批量插入)
- 26. ORACLE触发器INSERT更新
- 27. Oracle触发器不更新
- 28. Oracle在插入另一个表时触发更新
- 29. Oracle插入或删除或更新时触发
- 30. 使用触发器更新正在插入/更新的记录
您可能希望在插入更新触发器前使用一个日志表,然后以批处理方式(每晚,不管)进行处理。一定要添加一个“action_date”日期字段(或时间戳),您可以稍后使用该字段根据发生的ins/upd的时间来选择性地提取数据。 – tbone 2012-01-10 13:08:03
感谢tbone,这将是一个很好的解决方案。但是在不改变应用程序的情况下,我想我需要在表格上添加一个更新触发器,在该列的后面添加一个额外的“最新更新/更改列”。或者说甲骨文在这个功能的构建? – user85155 2012-01-11 09:30:19