【问题标题】:Alternative to Delete Trigger for tracking deleted records用于跟踪已删除记录的删除触发器的替代方法
【发布时间】:2011-04-05 23:49:02
【问题描述】:

我的任务是创建一个大型数据复制服务来供应我们的数据仓库。源数据库位于其他服务器上。

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

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

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

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

有什么建议吗?

【问题讨论】:

  • 有什么理由不能执行“软删除”,在删除后用1 标记DELETED 位列?
  • 哦,我希望!这些源数据库系统实际上是由第三方供应商开发的。我们一直从这些供应商那里获得更新,他们可能会在更新中清除整个架构。

标签: .net sql-server tsql provisioning sqlbulkcopy


【解决方案1】:

我认为删除触发器不会那么糟糕。 1 亿条记录绝对是一个好块,但是您在服务器上运行触发器,以 SQL 可以优化执行路径的方式。

如果您在客户端执行其他操作,则会产生从服务器获取记录然后向仓库发出删除命令的开销。

困扰你的触发器是什么?

【讨论】:

  • 这是一个非常好的问题。这些源数据库由第三方供应商安装。我很好奇是否有人提出了触发技术的替代方案。
【解决方案2】:

根据我的阅读,您正在尝试重新发明复制 (http://msdn.microsoft.com/en-us/library/ms151198.aspx)。就这样总结了吗?如果是这样,我的建议是不要。

【讨论】:

  • 你说的很对。您可以在 Oracle 数据库和 SQL Server 数据库之间进行复制吗?你能推荐一些“SQL Server Replication For Dummies”链接/书籍吗?
  • 您可以在 Oracle 和 SQL 服务器之间进行复制(尽管我个人没有任何经验)。如果我刚开始,我会从我提供的链接(它转到 SQL 联机丛书)开始,看看有什么可以看的。我唯一的建议是从简单开始,因为一路上有一些令人讨厌的曲折。
【解决方案3】:

SQL Server 具有内置的更改跟踪功能(至少在 2008 R2 中,我不确定何时引入此功能)。在这里阅读更多:http://msdn.microsoft.com/en-us/library/cc280462.aspx

【讨论】:

  • 呲牙咧嘴,真是太棒了。不幸的是,它看起来只适用于 Sql Server 2008,而且我也有需要工作的 oracle 和 SQL Server 2005 服务器。感谢您提供有趣的信息!
【解决方案4】:

我可能不完全理解您在做什么,但在 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

【讨论】:

  • 那很好。以前从未这样做过。不幸的是,我想避免对源数据库进行任何更改,因为它们是由第三方供应商开发的。谢谢你的帖子!
  • @N8 - 好的。所以你不是控制删除的人。您想在您的供应商代码中捕获删除并跟踪它们吗?
  • 有点,我们有一些自定义代码来配置数据仓库。我们直接访问我们的第三方应用程序数据库,然后使用一些额外的逻辑为来自第三方系统的工件提供一个仓库密钥,该密钥可用于连接到数据仓库中其他系统的数据。
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多