替代删除触发器以跟踪已删除的记录

问题描述:

我有一项任务是创建一个大型数据复制服务来配置我们的数据仓库。源数据库驻留在其他服务器上。替代删除触发器以跟踪已删除的记录

到目前为止,我已经能够实现更新和插入使用SqlBulkCopy类的物品一起进入仓库,以及TSQL语句节选。

我现在的问题是处理记录删除。我能想到的处理删除的唯一方法是在表上创建一个自定义触发器,将删除的记录插入到我的服务可以读取的临时表中,并从仓库中删除。

我知道有很多的数据复制工具,在那里,但该公司希望在内部的服务定制。

note一些将配置的表超过1亿条记录。

有什么建议吗?

+1

任何你不能做“软删除”的地方,你删除它时用'1'标记'DELETED'位列? – JNK 2011-04-05 14:07:00

+0

哦,我希望!这些源数据库系统实际上是由第三方供应商开发的。我们总是从这些供应商处获得更新,他们可能会在更新中清除整个模式。 – 2011-04-05 14:12:47

我不认为删除触发器会很糟糕。 1亿条记录绝对是一个好的组块,但是你正在服务器上运行触发器,这样SQL可以优化执行路径。

如果你做别的事情的客户端,你要承担的开销从服务器获取记录,然后发出删除命令到仓库。

关于一个令你困扰的触发器是什么?

+0

这是一个非常好的问题。这些源数据库由第三方供应商安装。我很好奇,如果有人提出了触发技术的替代方案。 – 2011-04-05 14:22:14

从我读什么,你要重新发明复制(http://msdn.microsoft.com/en-us/library/ms151198.aspx)。这是不是总结了一下?如果是这样,我的建议是不会的。

+0

你很对。你可以在Oracle数据库和SQL Server数据库之间进行复制吗?您能否提出一些“SQL Server Replication for Dummies”链接/书籍? – 2011-04-05 15:07:22

+0

你可以在Oracle和SQL服务器之间进行复制(尽管我个人没有任何经验)。如果我刚开始,我会从我提供的链接开始(它转到SQL Books Online)并查看要查看的内容。我唯一的建议是开始简单,因为沿途有一些令人讨厌的曲折。 – 2011-04-06 02:09:12

我可能不完全明白你在做什么,但在SQL Server中,你可以捕捉与该output clause删除的行。也许这是你可以使用的东西。

-- Table to delete from 
declare @T table (id int, name varchar(50)) 

-- Table to capture the deleted rows 
declare @DeletedRows table (id int, name varchar(50)) 

-- Dummy data 
insert into @T values 
(1, 'Name1'), 
(2, 'Name2'), 
(3, 'Name3'), 
(4, 'Name4'), 
(5, 'Name5') 

-- Delete every other row 
delete from @T 
output deleted.id, deleted.name into @DeletedRows 
where id % 2 = 0 

select * 
from @DeletedRows 

结果 - 删除的行

id   name 
----------- -------------------------------------------------- 
2   Name2 
4   Name4 
+0

多数民众赞成在整齐。从来没有这样做过。不幸的是,这种情况是我想避免对源数据库进行任何更改,因为它们是由第三方供应商开发的。感谢您的文章! – 2011-04-05 17:06:28

+0

@ N8 - 好的。所以你不是控制删除的人。您想要在您的供应商代码发生时删除这些删除并跟踪它们吗? – 2011-04-05 17:15:06

+0

有点,我们有一些自定义的代码来提供数据仓库。我们直接访问我们的第三方应用程序数据库,然后使用一些额外的逻辑为来自第三方系统的工件提供仓库密钥,该密钥可用于加入数据仓库中的其他系统数据。 – 2011-04-05 17:49:50

SQL Server有内置的更改跟踪(至少在2008 R2,我不知道什么时候被介绍此功能)。在这里阅读更多:http://msdn.microsoft.com/en-us/library/cc280462.aspx

+0

太棒了!我会看一看! – 2011-04-05 17:04:35

+0

,这真的很整齐。不幸的是,它看起来像只适用于Sql Server 2008,并且我有oracle&SQL服务器2005服务器,我也需要工作。尽管感谢有趣的信息! – 2011-04-06 16:36:47

我不得不使用触发器插入记录ID添加到临时表中的好经验。然后,我们创建了一组SSIS包和SQL代理作业轮询登台表并根据登台表的内容采取适当的操作。这使得实现自定义成为可能。由于我们在OLTP系统和仓库之间移动数据,因此很有意义 - 记录不总是排成行。