2012-01-10 8 views
5

挿入/更新されたすべてのデータを外部ツールで処理するために追加のログファイルに書き込むテーブルにトリガを配置します。オラクルはすべての挿入/更新をファイルに書き込む

これを達成する方法はありますか?

+1

ログテーブルにbefore update updateトリガを使用し、後でバッチ処理(毎晩何でも)で処理することができます。後でins/updが発生したときに基づいてデータを選択的に引き出すために使用できる「action_date」日付フィールド(またはタイムスタンプ)を必ず追加してください。 – tbone

+0

感謝tbone、これは良い解決策になります。しかし、アプリケーションを変更することなく、私はテーブルに更新トリガーを置く必要があると思う余分な "最後の更新/変更列"その列の後半選択を追加します。または、オラクルはこのための機能を構築していますか? @tboneがコメントしたよう彼らはAFTERトリガーよりも効率的であるため – user85155

答えて

5

表の行が変更された後に実行され、UTL_FILEパッケージを使用してログ・ファイルに書き込むトリガーを作成する必要があります。

UTL_FILEパッケージ情報はここで見つけることができます: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm

とトリガのドキュメントには、ここで見つけることができます: http://bytes.com/topic/oracle/answers/762007-trigger-output-text-file

:あなたがここに探しているものに似た答えはあり http://docs.oracle.com/cd/B10501_01/appdev.920/a96590/adg13trg.htm

ここでPL/SQLを使用してファイルに書き込む方法の詳細: http://www.devshed.com/c/a/Oracle/Writing-to-Text-Files-in-Oracle-PLSQL/

希望します。

+1

は、あなたがBEFOREトリガーを検討する必要があります - オラクルのドキュメントから:BEFORE行トリガーは少し行トリガー後よりも、より効率的です。 AFTER行トリガーでは、影響を受けたデータ・ブロックをトリガーに対して1回(論理読み取りではなく、物理読み取りではなく)読み取ってからトリガー・ステートメントで再度読み取る必要があります。あるいは、BEFORE行トリガーでは、トリガー・ステートメントとトリガーの両方に対してデータ・ブロックを一度だけ読み取る必要があります。 – Ollie

1

はい、hereには、updateの例があります。

insertと同様の操作を行うだけで済みます。

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を更新する必要があります」という勅令)に置き換えることでこれを回避したいと考えています。これは通常、データの不一致を招きます。

関連する問題