“客户已经为审计日志定义了他们想要的表结构”
恐言。
以下是您将如何实现这样的事情:
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;
/
如您所见,它涉及大量重复,但使用构建在数据字典上的代码生成器很容易处理。但这种方法存在更严重的问题。
- 它有相当大的开销:涉及十个字段的单个更新将生成十个插入语句。
- 当我们必须处理不同的数据类型时,BeforeValue 和 AfterValue 列会出现问题——甚至日期和时间戳也会变得有趣,更不用说 CLOB。
- 很难在某个时间点重建记录的状态。我们需要从记录的最早版本开始,逐步应用后续更改。
- 这种方法如何处理 INSERT 和 DELETE 语句还不是很明显。
现在,如果客户的基本要求是监视对少数敏感列的更改:EMPLOYEES.SALARY、CREDIT_CARDS.LIMIT 等,那么这些反对意见都不是问题。但是如果要求监视每个表的更改,则“整个记录”方法更好:只需为受 DML 影响的每一行插入一条审计记录。