在 SQL Server 2008 中为给定数据库的所有表中跟踪/记录插入/更新/删除行的最佳方法是什么?
或者 SQL Server 2008 中是否有更好的“审计”功能?
在 SQL Server 2008 中为给定数据库的所有表中跟踪/记录插入/更新/删除行的最佳方法是什么?
或者 SQL Server 2008 中是否有更好的“审计”功能?
简短的回答是,没有一个单一的解决方案适合所有人。这取决于系统,但和要求,但这里有几种不同的方法。
DML 触发器
相对容易实现,因为你必须写一个对一张表很好用的,然后再应用到其他表上。
缺点是当你有很多表甚至更多触发器时它会变得混乱。管理 200 个表的 600 个触发器(每个表插入、更新和删除触发器)并不是一件容易的事。此外,它可能会导致性能影响。
在 SQL Server 中创建审计触发器
使用触发器记录对数据库表的更改
变更数据捕获
非常容易实现,本机支持,但仅在企业版中可能要花费很多美元;)。另一个缺点是 CDC 仍然没有达到应有的水平。例如,如果您更改架构,历史数据就会丢失。
事务日志分析
这样做的最大好处是您需要做的就是将数据库置于完全恢复模式,所有信息都将存储在事务日志中但是,如果您想正确执行此操作,您将需要第三方日志阅读器,因为这是本机不支持。
在 SQL Server 2008 SQL Server 事务日志资源管理器/分析器中读取日志文件 (*.LDF)
If you want to implement this I’d recommend you try out some of the third party tools that exist out there. I worked with couple tools from ApexSQL but there are also good tools from Idera and Netwrix
ApexSQL Log – auditing by reading transaction log
ApexSQL Comply – uses traces in the background and then parses those traces and stores results in central database.
Disclaimer: I’m not affiliated with any of the companies mentioned above.
我不记得是否已经有一些工具可以做到这一点,但是您始终可以使用触发器(然后您将可以访问具有更改行的临时表 - INSERTED 和 DELETED)。不幸的是,如果您想跟踪所有表格,这可能是一项艰巨的工作。我相信应该有一些更简单的解决方案,但不记得我说的。
编辑。
也许这可能会有所帮助:--更改跟踪 http://msdn.microsoft.com/en-us/library/cc280462.aspx
Change Data Capture旨在做您想做的事,但它需要单独设置每个表,因此根据您拥有的表的数量,可能会有一些后勤工作。默认情况下,它也只会将数据存储在捕获表中几天,因此您可能需要一个 SSIS 包将其拉出并存储更长时间。
http://msdn.microsoft.com/en-us/library/cc280386.aspx
这允许您在数据库级别进行审计;它可能不足以满足业务需求,也可能不足以满足业务需求,因为如果没有将它们粘合在一起的逻辑,数据库记录通常没有那么大的意义。例如,如果知道用户 x 使用“projects”、“users”、“time_status”表的外键向“time_booked”表中插入了一条记录,那么如果没有 SQL 查询来粘合这 4 个表,则可能没有多大意义一起。
您可能还需要让每个数据库用户使用他们自己的用户 ID 进行连接 - 这对于集成安全性和客户端应用程序来说很好,但可能不适用于使用连接池的网站。
无法像那样分析 sql server 日志。有一些 3rd 方工具可用于读取日志,但据我所知,您无法查询它们以获取统计信息等。如果您需要此类信息,则必须创建某种审计以在单独的表中捕获所有这些事件。您可以使用“DDL 触发器”。