2010-06-08 88 views
3

我在写一个触发器来审计表中的更新和删除操作。我使用SQL Server 2008审计表的SQL触发器

我的问题是,

有没有办法找出正在采取什么行动上的记录,而不通过删除和插入表格的选择阶段了?

另一个问题是,如果记录被删除,我如何在审计表中记录正在执行删除的用户。 (注意:连接到数据库的用户是一个具有设置用户的普通连接字符串,我需要登录到Web应用程序或Windows应用程序的用户)

请帮忙吗?

+1

您使用的是什么RDBMS?和版本? – 2010-06-08 17:26:53

+0

SQL Server 2008和2005(LOL不问,长话短说) – mattgcon 2010-06-08 17:29:48

回答

3

对于第一部分,您可以设置单独的触发器或使用一个触发器来检查特殊表INSERTEDDELETED区分更新和删除。

对于第二部分,在这种情况下没有办法绕过它,您将不得不通过Web/Windows应用程序以某种方式将该用户名获取到数据库。不幸的是,你不能与触发器本身进行通信,而且对于通用连接字符串,DB不知道它处理的是谁。

我发现将“LastModifiedBy”列添加到您计划审计的表中可能会有所帮助,以便您可以将该信息存储在原始表本身上。然后你的触发器将这些信息复制到审计表中。这也很好,因为如果你只需要知道最后一个碰触某人的人是什么,那么你根本不必查看审计表,只需检查一列即可。

+0

我确实有一个修改列和修改日期时间列,所以审计跟踪仍然存在的记录将能够显示谁通过生活的记录。虽然删除,但会很棘手。 您是否认为在删除记录之前实际执行记录更新会产生反效果并且是不明智的。 (I.E .:在删除存储过程中,在删除语句之前插入更新语句并首先更新修改后的和日期时间列),这样删除记录时,触发器可以接收用户。 – mattgcon 2010-06-08 17:35:49

+0

您可以直接在审计表中审核删除操作,而不是使用触发器......如果您能够在删除操作之前执行更新,那么您可以将其自己添加到审计表中。 。当有多个来源进行更改(包括直接通过SSMS)时,触发器更有用,您希望确保捕获。 – Jaymz 2010-06-08 17:43:02

+1

我和Jaymz在一起,我们可能会将触发器视为金锤。一旦你开始考虑更新只是为了使审计工作,听起来不太吸引人。只有当你对调用数据库的东西拥有零控制权时,我才会追求这条路线。 – roufamatic 2010-06-08 17:59:41

1

要了解正在执行的操作,可以使用INSERTED和DELETED表比较值之前和之后的值。有没有什么神奇的方式来告诉哪个用户的Web应用程序已经做出了改变。通常的方法是在表格中添加一个修改过的列,然后用相关用户名填充该Web应用程序代码

3

正如roufamatic所说,您可以设置特定于每个操作的触发器,也可以针对INSERTED和DELETED表进行检查。

至于删除用户,只要应用程序中的代码处理它,就可以将该信息传递到触发器中。我在一年前遇到了一个客户端的需求,我想到的解决方案是使用SET CONTEXT_INFO和CONTEXT_INFO()传递用户名。我们所有的数据库访问都是通过存储过程进行的,所以我只需要将一行或两行代码添加到删除存储过程中以SET CONTEXT_INFO,然后我更改了删除触发器以从CONTEXT_INFO()获取用户。用户名必须作为参数从应用程序中传递。如果你没有使用存储过程,你可能只能在应用程序中执行SET CONTEXT_INFO。我不知道连接池如何影响该方法。显然,如果有人在应用程序之外进行了删除操作,那么除非您还在触发器中分别捕获了USERNAME()(可能是个好主意,尽管我们的审计日志不是必需的,报告比安全更重要)。

有一点点技巧性,因为CONTEXT_INFO是一个二进制字符串,但它没有花很长时间才得到所有的结果。

恐怕我没有任何代码方便,因为它是为过去的客户。如果在通过CONTEXT_INFO和SET CONTEXT_INFO的帮助后遇到任何问题,请随时在这里发帖,我会看到我能记得的东西。

4

请考虑一下,如果您实际上没有删除记录,但添加了一个字段以将它们标记为已删除,则可以从上次修改中获取用户。如果您想要实际删除记录,则可以在每次批处理中删除一个夜间作业。如果太多的记录被删除并且没有运行,甚至可以设置该标记来标记。

最简单的方法是,重命名表格,将IsDeleted列作为位字段添加,然后创建一个名称与表名相同的视图。该视图将选择isdelted为空的所有记录。

不要让任何人说出来使用触发器。您不希望进行未经授权更改的人员能够逃避审核。使用触发器(除了生产dba以任何方式修改表格之外,没有其他任何权利),那么除了dba之外,没有人可以删除而不经过审计。在没有存储过程来限制直接表访问的典型系统中,太多人通常会直接影响一张表,从而导致广泛的欺诈行为。犯下欺诈行为的人通常不会使用他们应该用来更改数据的应用程序。您必须在数据库级别保护数据。

当你编写你的触发器,确保他们可以处理多行插入/更新/删除。触发器一次对整组数据操作,而不是一行。