我们有以下要求:
目前,我们从源(另一个服务器,另一个团队,另一个数据库)获取数据到临时数据库(通过批处理作业),在我们将数据输入临时数据库后,我们处理数据,转换和更新我们的主数据DB与差异(即更改的记录或新添加的记录)。
Source-> tempDB(每日重新创建) - > delta-> primaryDB
要求: - 在源DB中删除数据后删除主数据库中的数据。 例如:假设在源代码中创建了ID = 1的记录,它将进入临时数据库并最终进入主数据库。在源中删除此记录时,它也应在主DB中删除。
挑战: 如果在临时数据库中没有任何内容可以引用,我们如何从主数据库中删除(因为记录已在源代码中删除,tempDB中没有任何内容)。
天真的做法: - 我们可以在每次转换和重新加载之前清理主DB。但是,每次清理和填充主数据库需要花费大量时间。
答案 0 :(得分:1)
您可以在每个填充已删除条目的历史记录表的表上创建触发器。将其同步到tempDB并使用它来删除主数据库中的内容。
您要么每个表需要一个“delete-history-table”,要么还要包含触发删除的tablename的组合历史记录表。
您可能希望查看SQL Compare或其他工具来同步表。
如果您可以同时访问tempDB和primeDB(相同的服务器或链接服务器),您也可以尝试
delete *
from primeBD.Tablename
where not exists (
select 1
from tempDB.Tablename where id = primeDB.Tablename.Id
)
会表现得非常糟糕 - 请问您的数据库设计师。
答案 1 :(得分:1)
在这个场景中,如果TEMPDB&主数据库没有直接引用,然后可以在数据库级别使用跟踪事件通知。
这是我得到的链接:
https://www.mssqltips.com/sqlservertip/2121/event-notifications-in-sql-server-for-tracking-changes/