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

时间:2011-04-05 14:00:58

标签: .net sql-server tsql provisioning sqlbulkcopy

我有一项任务是创建一个大型数据复制服务来配置我们的数据仓库。源数据库驻留在其他服务器上。

到目前为止,我已经能够使用SqlBulkCopy类和TSql Excepts语句的结合将更新和插入项目实现到仓库中。

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

我知道有很多数据复制工具,但公司需要定制的内部服务。

注意一些将要配置的表格超过1亿条记录。

有什么建议吗?

5 个答案:

答案 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系统和仓库之间移动数据,因此它很有意义 - 记录并不总是排成行。

相关问题