昨天刚好给一个日常使用频率很高的一个重要表单做了日志,下面简单写一下日志表单的创建思路:
1、首先明确日志表的结构,需要哪些字段,哪些是基本应该需要的提示,
一般而言基本包括:
People(操作者)、
Date(操作时间)、
OperationType(操作类型:插入、删除、更新)、
Object(操作对象:对哪个表单进行的操作)、
OldValue(执行操作前的旧值)、
NewValue(执行操作后的新值)
可以用四个词来形容:时间、地点、人物、干什么。
基本上有了这些字段,你都可以通过查询日志表获取基本的一些信息,当然你可以进行拼接一些生活化正式化的描述作为description字段,例如:'People'在'Date'时对表'Object'执行了'OperationType'操作,这样的较口语化,生活化的描述,效果更佳;
2、表的架构有了,那么现在就看看怎么用代码实现这个效果;
这里以Update触发器为例,After 类型的Update触发器,当然了,前提都一样需要循环遍历每一行,这里就不赘述了,大致的思路如下:
(1)、如果你想记录这个表的所有字段的前后变更情况,那么就使用这种思路比如说表有3个字段
那么假设旧表的记录为:
A B C
1 2 3
新表的记录为:
A B C
10 20 30
那么列转行的方式变成这样的结构:
旧表
A 1
B 2
C 3
新表
A 10
B 20
C 30
然后把这两个表通过第一列关联起来,并增加一列自增长的流水号,那么得到的为:
列1 列2 列3 流水列ID
A 10 1 1(流水字段)
B 20 2 2(流水字段)
C 30 3 3(流水字段)
然后开始循环:
DECLARE @i INT =1
DECLARE @q INT =MAX(流水列ID)
DECLARE @列2的值 varchar2
DECLARE @列3的值 VARCHAR2
WHILE @i<@q
BEGIN
SELECT @列2的值=列2,@列3的值=列3 FROM 联合表 WHERE ID =@i
然后判断
IF @列2的值<>@列3的值
说明该字段发生变化,
插入日志表
END
进入下次循环
SET @i=@i+1
END
(2)、如果你只想监控表中某几个关键字段的变化情况,那么可以这样写:
if update('字段1')
begin
插入日志表
end
if update('字段2')
begin
插入日志表
end
......
依此类推,
这里的Update()是系统方法,用来判定是否进行了更新,相同的还有Insert,delete。原理都一样。
这基本就是建立日志表的思路和方法,供大家参考!