我正在开发一个用于存储付款信息的应用程序。我们目前有一个交易审计表,因此可以使用:
如果在审计中的任何表中字段发生更改,我们会编写一个审计行,其中包含:1表名,字段名,旧值,新值和时间戳。每行更新时,每个字段会发生一次插入。
我总是避免使用SQL Server中的触发器,因为它们难以记录并且可以使故障排除更加困难,但这是否是触发器的一个很好的用例?
目前,应用程序确定需要自行添加的所有审计行,并且有时会向服务器发送数十万个审计行INSERT语句。这对我们来说非常缓慢而且无法维持。
答案 0 :(得分:2)
如果您正在运行企业版,请查看Change Data Capture。它提供了您正在寻找的DML审计跟踪,而没有与触发器或自定义用户/时间戳记录相关联的开销。
答案 1 :(得分:0)
我曾经在金融系统上工作过,每个审计中的表都有自己的审计表(例如USERS那里有USERS_AUDIT),具有相同的模式(减去主键)加上:
用于表示更改类型的char(1)列('I'=插入,'U'=更新,'D'=删除)
日期时间列,默认值为GETDATE()
varchar(255)列,指示进行更改的用户(默认为USER_ID()
)
这些表总是被审计中的表上的触发器插入(仅附加)。这将导致更少的插入和更好的性能,但代价是必须管理更多的审计表。
答案 2 :(得分:0)
之前我已经在SPROCS中实现了审计逻辑,但同样的想法适用于在触发器中执行它。
工作表:(id,field1,field2,field3,... field-n)
历史表:(用户ID,日期/时间,行动(CUD),id,field1,field2,field3,... field-n)
这也可以轻松查询数据如何历史变化。
每次更改表格中的一行时,都会在历史记录表格中创建一条记录。
我们的一些表格非常大 - 超过100个字段,因此100多个插页的负载太大,也无法快速查看数据发生的情况。