我有一项任务是创建一个大型数据复制服务来配置我们的数据仓库。源数据库驻留在其他服务器上。
到目前为止,我已经能够使用SqlBulkCopy类和TSql Excepts语句的结合将更新和插入项目实现到仓库中。
我现在的问题是处理记录删除。我唯一可以想到的处理删除的方法是在表上创建一个自定义触发器,将已删除的记录插入我的服务可以读取的临时表中,然后从仓库中删除。
我知道有很多数据复制工具,但公司需要定制的内部服务。
注意一些将要配置的表格超过1亿条记录。
有什么建议吗?
答案 0 :(得分:2)
我认为删除触发器不会那么糟糕。 1亿条记录绝对是一个很好的组块,但是你在服务器上运行触发器,SQL可以优化执行路径。
如果您在客户端执行其他操作,则会产生从服务器获取记录然后向仓库发出删除命令的开销。
关于困扰你的触发器有什么用?
答案 1 :(得分:1)
从我正在阅读的内容来看,你正试图重新发明复制(http://msdn.microsoft.com/en-us/library/ms151198.aspx)。那总结一下吗?如果是这样,我的建议是不会。
答案 2 :(得分:1)
SQL Server具有内置的更改跟踪功能(至少在2008 R2中,我不确定何时引入了此功能)。在此处阅读更多内容:http://msdn.microsoft.com/en-us/library/cc280462.aspx
答案 3 :(得分:0)
我可能完全不了解您在做什么,但在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
答案 4 :(得分:0)
我在使用触发器将记录ID插入登台表方面有很好的经验。然后,我们创建了一组SSIS包,SQL Agent作业轮询登台表,并根据登台表的内容采取适当的操作。这使得实现自定义成为可能。由于我们在OLTP系统和仓库之间移动数据,因此它很有意义 - 记录并不总是排成行。