sql - 如何在不直接在数据库上使用 fn_dblog 或 fn_dump_dblog 的情况下创建 sql 事务审计软件
问题描述
我正在开发一个 sql 事务审计软件
最初我在数据库上使用 fn_dblog 来读取 sql 事务并定期将它们写入文件,但后来我发现在生产数据库上使用 fn_dblog 是有风险的
所以请建议我从生产数据库中获取数据的任何其他替代方法
注意 - 我已经尝试通过从备份文件(.bak)中读取事务(在我的系统上而不是数据库上使用 fn_dblog)从备份文件(.bak)中获取 sql 事务历史记录,但这对我没有帮助(因为它不包含所有事务历史记录)
解决方案
fn_dblog()
是一个未记录的 SQL Server 函数,因此谨慎使用它是明智的。
您关于如何审计交易的问题实际上取决于您要审计的内容。真的是发生的每一笔交易吗?或者,它是特定类型的事务,如 DDL 和 DML 操作?有几个选项取决于这个问题的答案,yoru 具体的商业案例等。
- Change Data Capture于 2008 年推出,用于捕获插入、更新和删除活动。在许多情况下,这是人们想要编辑的内容。哪个用户(通常来自应用程序)编辑了数据库中的数据。
- 可以创建DDL和DML触发器以在特定事件发生时触发。对于 DML,这包括 INSERT、UPDATE、DELETE 等操作。您可以创建触发器以在操作发生后将其记录为审计功能。这些类型的触发器可能会导致性能问题,因此请务必阅读它们。我将从Aaron Bertrand 的博客开始。DDL 触发器依赖于某些DDL 事件,例如创建和删除数据库、创建加密、更改索引、创建用户等。
- SQL Server 审计是一种创建服务器审计的内置机制,它可以包含服务器级事件的服务器审计规范和数据库级事件的数据库审计规范。审计事件可以写入事件日志或审计文件。请注意,与变更数据捕获的一个很大区别是它不像 CDC 那样以干净的关系格式存储。
- 更改您的应用程序。这将是应用程序和数据库设计的更改,但这种方法通常会实施。本质上,每次对数据行进行更改时,都会插入一个带有时间戳和进行更改的用户的新行,而不是对其进行编辑。该记录成为“当前真相”记录和该记录的所有其他记录区域历史。SQL Server 具有使用ROWVERSION和TEMPORAL TABLES进行集成的方法
- 使用 Redgate、Solarwinds 等付费选项...
推荐阅读
- sql - 是否可以在审计表中有单独的列来存储列名以反映所做的更改
- java - 可选的通用参数或对抗类型错误的方法
- sql-server - mvc,两个项目连接到一个数据库,用项目-A更新表它在项目-B中不起作用
- airflow - MySqlToGoogleCloudStorageOperator 意外失败
- azure-cosmosdb - 是否可以使用 Azure cosmos mongodb API 创建多个“唯一且稀疏”的索引
- ios - iOS 12.0 Safari - 滚动时图像失真
- html - 时间选择器值未在顶部弹出
- visual-studio - Visual Studio 是如何使用的?
- javascript - 选择并设置具有特定子元素(跨度)的所有 div
- javascript - != 不在 while 循环中工作,导致无限循环