简介
许多应用程序都需要记录数据库中的数据变化,包括:哪些数据被更改、更改人和更改时间(审计日志记录) (维基百科audit logging)。 关于这个问题已经有了很多文章,而关于如何在Caché中实现也有很多不同的方法。
本文将介绍一个机制,帮助您实现用一个框架来跟踪和记录数据更改。一旦您的持久类继承自“审计抽象类”(Sample.AuditBase),此机制将通过“objectgenarator”方法创建一个触发器。由于这个持久类继承了Sample.AuditBase,所以当您编译持久类时,将自动生成用于审计更改的触发器。
Audit Class
这是将记录更改的类。
Class
Sample.Audit
Extends
%Persistent
{
Property
Date
As
%Date
;
Property
UserName
As
%String
(
MAXLEN
=
""
);
Property
ClassName
As
%String
(
MAXLEN
=
""
);
Property
Id
As
%Integer
;
Property
Field
As
%String
(
MAXLEN
=
""
);
Property
OldValue
As
%String
(
MAXLEN
=
""
);
Property
NewValue
As
%String
(
MAXLEN
=
""
);
}
Audit Abstract Class
这是您的持久类将继承的抽象类。这个类包含触发器方法(objectgenerator),除了在审核表(Sample.Audit)中写入更改之外,该触发器方法还知道如何识别哪些字段被更改、更改人、新旧值等。
Class
Sample.AuditBase
[
Abstract
]
{
Trigger
SaveAuditAfter [
CodeMode
= objectgenerator,
Event
= INSERT/UPDATE,
Foreach
= row/object,
Order
=
99999
,
Time
= AFTER ]
{
#dim
%compiledclass
As
%Dictionary.CompiledClass
#dim
tProperty
As
%Dictionary.CompiledProperty
#dim
tAudit
As
Sample.Audit
Do
%code
.
WriteLine
(
$Char
(9)_
"; get username and ip adress"
)
Do
%code
.
WriteLine
(
$Char
(9)_
"Set tSC = $$$OK"
)
Do
%code
.
WriteLine
(
$Char
(9)_
"Set tUsername = $USERNAME"
)
Set
tKey