【发布时间】:2011-12-29 15:43:25
【问题描述】:
免责声明:我无法在应用程序中正确实现这一点,因为我正在处理的应用程序没有以一致的方式进行数据访问,并且重构工作对于项目范围和即将到来的范围来说太大了截止日期。
我将如何为审计跟踪实现 SQLCLR 触发器?我希望它尽可能简单,并且在以后尽可能容易地删除和替换为适当的实现。
我打算将我的审计写入单个表(数据库不是很重),具有如下列:
- 时间戳 (
datetime) - 更改发生的时间? - 用户名 (
varchar) - 谁做了更改? - AffectedTableName (
varchar) - 哪个表受到影响? - AffectedRowKey (
varchar) - 这将是一个简单或复合键,例如 (Id=42,A=4,B=2) - OperationType (
char(1)) -I、U或D分别用于插入、更新和删除。 - InsertedXml (
xml) - xml 序列化行 (SELECT * FROM INSERTED FOR XML AUTO) - DeletedXml(
xml) - xml 序列化行 (SELECT * FROM DELETED FOR XML AUTO)
我计划在应用程序中查询这些数据并将其解析为用户可读的表单。我打算将其实现为使用 SQLCLR 编写的数据库触发器。我可以看到 2 种可能的方法:
- 将此完全实现为 SqlTrigger 方法:
- 将此实现为带参数的 SqlProcedure 方法:
- 架构名称
- 表名
- 插入的Xml
- 已删除Xml
我将不胜感激任何建设性的批评和建议。我的限制是我必须使用触发器在数据库级别实现审计,并且我希望它尽可能可维护(阅读:可移动和可替换)。同样理想的是,我不希望数百个触发器具有完全相同的主体,以防我不得不修改它们。
【问题讨论】:
标签: sql sql-server tsql triggers sqlclr