审计跟踪的SQLCLR触发器或存储过程的可行性?

时间:2011-11-15 15:44:40

标签: sql sql-server tsql triggers sqlclr

免责声明:我无法在应用程序中正确实现此功能,因为我正在处理的应用程序不能以一致的方式进行数据访问,并且重构工作对于项目范围来说太大了限期

如何实施审计跟踪的SQLCLR触发器?我希望它尽可能简单,并且尽可能容易删除并替换为适当的实现

我打算将我的审计编写到一个表中(数据库写得不是很重),列有以下列:

  • 时间戳(datetime) - 何时发生变更?
  • 用户名(varchar) - 谁进行了更改?
  • AffectedTableName(varchar) - 哪个表受到影响?
  • AffectedRowKey(varchar) - 这将是简单或复合键,如(Id=42A=4,B=2
  • OperationType(char(1)) - 分别为IUD进行插入,更新和删除。
  • InsertedXml(xml) - xml序列化行(SELECT * FROM INSERTED FOR XML AUTO
  • DeletedXml(xml) - xml序列化行(SELECT * FROM DELETED FOR XML AUTO

我打算在应用程序中查询并将此数据解析为用户可读的表单。我打算将其实现为使用SQLCLR编写的数据库触发器。我可以看到两种可能的方法:

  • 完全以SqlTrigger方法实现:
  • 将此实现为带参数的SqlProcedure方法:
    • SCHEMANAME
    • 表名
    • insertedXml
    • deletedXml

我将感谢任何建设性的批评和建议。我的局限是我必须使用触发器在数据库级别实现审计,并且我希望它尽可能可维护(读取:可移动和可替换)。理想情况下,我不希望有数百个具有完全相同主体的触发器,以防我必须修改它们。

2 个答案:

答案 0 :(得分:2)

SQLCLR触发器存在严重限制,会阻止您在SQLCLR中实现审计触发器:您无法找到从SQLCLR触发器内部更改的父对象。即如果您有一个SQLCLR触发例程注册到多个表,则无法找到更新/插入/删除的表。乍一看@@ procID可能看起来很有用,但是当从SQLCLR触发器内部调用时,@@ procid返回相同的值,无论哪个表受到影响。我已经搜索了互联网并进行了大量实验,但我还没有找到解决方案。我发现有更多人遇到同样的问题。有些消息的历史可以追溯到2006年。

我已在Microsoft Connect上与Microsoft创建了一项功能请求。请登录并按向上箭头以实现它,这样您实际上可以使用SQLCLR触发器来实现您的目的:https://connect.microsoft.com/SQLServer/feedback/details/768358/a-sqlclr-trigger-should-be-given-the-parent-object-in-the-sqltriggercontext

答案 1 :(得分:1)

我一直在使用这个脚本的变体来创建我的一些项目的审计触发器一段时间,结果很好:

http://www.simple-talk.com/sql/database-administration/pop-rivetts-sql-server-faq-no.5-pop-on-the-audit-trail/