为SQL Server中具有很多列的大表创建审核表

时间:2018-07-10 21:55:28

标签: sql-server tsql

我知道这个问题已经问过很多次了。我的问题是,我有一个表,该表大约有8000条记录,但有大约25列。我想监视我们在此表中所做的任何更改。我的服务器只有2008年。

我们通常会为要监视的特定表创建一个审计表,并使用游标将任何更改记录到该表中,因为通常需要监视许多列。但这次我不想要那个!

您认为不是游标,而是可以使用触发器来创建一个称为审计表XYZ的表,并监视其中的更改,其中包含字段名,旧值,新值,update_date,用户名等列?

非常感谢!

1 个答案:

答案 0 :(得分:1)

简短答案

是的,绝对在游标上使用触发器。游标因滥用和性能不佳而声誉不佳,因此在可能的情况下,请避免使用它们。

更长的答案

如果您对正在读/写此表的应用程序有控制权,请考虑让其构建用于审核的查询。使用INSERT / UPDATE / DELETE触发器(我假设这是您要使用的)要提防的事情是,这将增加对该表的查询的写时间,而在其自己的查询中编写审计将避免这种情况(有一个警告,我将在下一段中详细介绍)。您还需要考虑的是审计表需要包含多少元数据。例如,如果您的应用程序要求用户登录,则您可能希望将其用户名登录到审核表,该触发器可能无法使用该用户名。一切都取决于审核表需要为您的应用程序服务的目的。

在这种情况下触发器具有的一个优点是它们与基础查询绑定到同一事务。因此,如果您的INSERT / UPDATE / DELETE查询失败并回滚,则由触发器创建的审计行也将随之回滚,因此您永远不会以不存在的行作为审计条目。如果您希望通过触发器编写自己的审核查询,则需要小心以确保它们处于同一事务中,并在发生错误时正确回滚