「顧客は、監査ログに必要なテーブル構造を定義しました」
恐ろしい言葉。
このようなことを実装する方法は次のとおりです。
create or replace trigger emp_bur before insert on emp for each row
begin
if :new.ename = :old.ename then
insert_audit_record('EMP', 'ENAME', :old.ename, :new.ename);
end if;
if :new.sal = :old.sal then
insert_audit_record('EMP', 'SAL', :old.sal, :new.sal);
end if;
if :new.deptno = :old.deptno then
insert_audit_record('EMP', 'DEPTNO', :old.deptno, :new.deptno);
end if;
end;
/
ご覧のとおり、これには多くの繰り返しが含まれますが、データディクショナリ上に構築されたコードジェネレーターを使用すると、処理が簡単になります。しかし、このアプローチにはもっと深刻な問題があります。
- これにはかなりのオーバーヘッドがあります。10個のフィールドに触れる1回の更新で、10個の挿入ステートメントが生成されます。
- 異なるデータ型を処理する必要がある場合、BeforeValue列とAfterValue列は問題になります。CLOBはもちろん、日付やタイムスタンプも興味深いものになります。
- ある時点でのレコードの状態を再構築することは困難です。レコードの最も古いバージョンから始めて、その後の変更を段階的に適用する必要があります。
- このアプローチがINSERTおよびDELETEステートメントをどのように処理するかはすぐにはわかりません。
現在、顧客の根本的な要件が少数の機密性の高い列(EMPLOYEES.SALARY、CREDIT_CARDS.LIMITなど)への変更を監視することである場合、これらの異議は問題になりません。ただし、要件がすべてのテーブルへの変更を監視することである場合、「全体「レコード」アプローチの方が優れています。DMLの影響を受ける行ごとに1つの監査レコードを挿入するだけです。