-4

我使用 SQL Server 2008 R2 和 SSAS 和 SSIS。

我创建了一个阶段数据库,每天都从 OLTP 数据库中填充。

然后在数据清理和集成数据 (ETL) 之后,我最常将我的数据传输到DataWarehouse.

现在我需要做的是如何更改我的 OLTP 数据库中的跟踪。

我知道解决方案Trigger(我可以在 OLTP 数据库中的所有表上触发触发器,并在触发器内从 Inserted 和 Deleted 表中记录数据 Inserted/Deleted/Updated)

但是我的 OLTP 数据库非常大(大约 80,000,000 条记录)并且创建触发器使我的业务变慢。

我从这个网站上找到了一些这样的查询:

SELECT 
*
FROM 
sys.fn_dblog(NULL,NULL)

显示LDF文件中的所有记录。

我找到了一些可以读取 LDF 文件然后提取命令(插入/更新/删除)命令的第三方软件,例如ApexSQL

我在这个网站上找到了一个问题How to view transaction logs in SQL Server 2008

最后我认为如果第 3 方可以从 LDF 文件中提取此命令,为什么我们不能提取该命令?!?

另一方面,我需要在 OLTPs 数据库中找到像 Alter Table 和 Alter Field 这样的 DDL 命令来更改我的阶段数据库。

我发现这个链接可以从 LDF 文件中恢复已删除的行。

4

3 回答 3

3

You can use the sys.fn_dblog() function that was described in Kalen Delaney's SQL Server xxx Internals book to dump out log entires,

-- Use adventure works
USE AdventureWorks2012;
go

-- Dump (ins, del, upd) rows
SELECT *
FROM sys.fn_dblog(NULL,NULL)
WHERE Operation IN ('LOP_DELETE_ROWS', 'LOP_INSERT_ROWS','LOP_MODIFY_ROW');
go

However, the are binary fields that contain the inserted and deleted data. Also, updates might only contain partial data.

I did not do much research on this ...

However, everyone knows that fixed data is stored first in a row followed by variable length data. See the internals book. You will have to parse out each part of the binary blob. This is for simple data, not special page types.

Check out this blog article that takes a swag at just doing that for a fixed example.

If you want to do it dynamically for any table, buy a Commercial Off The Shelf (COTS) product from a company that has spent the time doing the research.

于 2013-09-05T18:50:18.623 回答
3

虽然上面的答案会告诉您如何查看事务日志,但我同意 JNK 的观点,即解析事务日志不是表更改的良好审计跟踪。

这完全取决于您想要保留多少审计数据以及您愿意在审计中放慢多少速度。不要忘记数据保留期。

1 -表和数据库级别的基于触发器的审计工作正常。有关这方面的介绍,请参阅我的博客

但是,对具有大量更改的表进行审计可能不切实际,并且您可能永远不会使用这些数据。保留期是关键。

2 - 如果您想使用 SQL Server 中内置的功能,请查看更改数据捕获功能。它基于将日志文件作为定期 SQL 代理作业读取。因此,您没有每个事件的触发器触发。在某事发生与发生之间存在滞后时间。

3 - 如果您只是查看记录是由谁以及何时插入或更新的,这可以通过修改数据仓库的自定义 ETL 代码来完成。只需将这些字段添加到表中并让代码更新它们。

我希望这些建议能让你远离阅读交易日志,这实际上可能非常乏味。

约翰

于 2013-09-05T19:00:25.407 回答
2

我发现这个:

Select * from ::fn_dblog(null,null)

或查看此链接:如何查看 SQL Server 2005 事务日志文件

或此链接:您如何解码事务日志中的简单条目?

于 2013-09-30T07:44:53.320 回答