Sql server 2008 如何从SQL Server中的LDF文件中提取T-SQL命令?
我使用SQLServer2008R2以及SSAS和SSIS 我创建了一个Stage数据库,每天都从OLTPs数据库中填充 然后,在数据清理和集成数据(ETL)之后,我将大部分数据转移到Sql server 2008 如何从SQL Server中的LDF文件中提取T-SQL命令?,sql-server-2008,ssis,ssas,data-warehouse,olap,Sql Server 2008,Ssis,Ssas,Data Warehouse,Olap,我使用SQLServer2008R2以及SSAS和SSIS 我创建了一个Stage数据库,每天都从OLTPs数据库中填充 然后,在数据清理和集成数据(ETL)之后,我将大部分数据转移到数据仓库 现在我需要做的是如何在OLTPs数据库中更改跟踪 我知道解决方案Trigger(我可以在OLTP数据库中的所有表上触发一个触发器,并记录触发器中插入/删除/更新的插入和删除表中的数据) 但我的OLTP数据库非常大(大约8000000条记录),create trigger使我的业务变慢 我在这个网站上找到了
数据仓库
现在我需要做的是如何在OLTPs数据库中更改跟踪
我知道解决方案Trigger
(我可以在OLTP数据库中的所有表上触发一个触发器,并记录触发器中插入/删除/更新的插入和删除表中的数据)
但我的OLTP数据库非常大(大约8000000条记录),create trigger使我的业务变慢
我在这个网站上找到了如下查询:
SELECT
*
FROM
sys.fn_dblog(NULL,NULL)
显示LDF
文件中的所有记录
我发现一些第三方软件可以读取LDF文件,然后提取命令(插入/更新/删除),如
我在这个网站上发现了一个问题
最后我想,如果第三方可以从LDF文件中提取这个命令,为什么我们不能提取呢
另一方面,我需要在OLTPs数据库中找到像ALTERTABLE和ALTERFIELD这样的DDL命令来更改我的后台数据库
我发现它可以反转LDF文件中删除的行 您可以使用Kalen Delaney的SQL Server xxx Internals一书中描述的sys.fn_dblog()函数转储日志实体
-- 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
但是,这些字段是包含插入和删除数据的二进制字段。此外,更新可能只包含部分数据
我没有对此做太多研究
然而,每个人都知道固定数据首先存储在一行中,然后是可变长度的数据。看这本书。您必须解析出二进制blob的每个部分。这适用于简单数据,而不是特殊的页面类型
看看这一点,这需要在一个固定的例子,只是这样做的抽签
如果您想为任何表动态执行此操作,请从花时间进行研究的公司购买商用现货(COTS)产品。虽然上面的答案将告诉您如何查看事务日志,但我同意JNK的观点,即解析事务日志并不是表更改的良好审计线索 这完全取决于您想要保留多少审计数据,以及您愿意在审计过程中放松多少速度。不要忘记数据保留期 1-基于触发器的审计在表和数据库级别都可以正常工作。请参阅我的,以了解有关此的演示 但是,对具有大量更改的表进行审核可能不实用,并且您可能永远不会使用数据。保留期是关键 2-如果要使用SQL Server内置的功能,请查看更改数据捕获功能。它基于作为周期性SQL代理作业读取日志文件。因此,您没有针对每个事件的触发器触发。在某事发生和它发生之间有一个滞后时间 3-如果您只是查看记录是由谁插入或更新的,以及何时插入或更新的,那么这可以通过修改数据仓库的自定义ETL代码来完成。只需将这些字段添加到表中,并让代码更新它们 我希望这些建议能让您远离阅读事务日志,因为它实际上可能非常乏味 约翰我发现:
Select * from ::fn_dblog(null,null)
或参阅此链接:
或此链接:我需要一个更窄、格式更准确的问题。根据您的编辑,您需要开始使用一些更改跟踪。为此解析日志文件不是一个解决方案。我认为
更改数据捕获
是更好的解决方案。谢谢。