我们有两个数据库,一个在 SQL Server 中,一个在 DB2 中,我们有一个场景,我们在 SQL Server 中进行一些数据插入、数据更新和删除,同时我们也在 Db2 中进行数据插入、更新和删除。
我们使用一些进程来回同步数据,每当 SQL Server 发生更改时,我们都会将数据同步到 db2 进行插入、更新和删除,如果 db2 发生更改,我们会将数据同步到 SQL Server,我们使用 IBM MQ 消息我们将消息出队以来回同步更改。
一切都很好,直到我们遇到了从 Db2 到 SQL Server 的数据同步问题,我们的一个进程停止了从 db2 到 SQL Server 的同步,因此有一个每天晚上运行的按需作业,将从 Db2 进行完整的数据刷新到SQL Server,但我们只进行合并更新和插入,我们不进行删除,因为尚未同步到db2的数据也存在于SQL Server中,因此我们不能直接删除,因为两个数据库都可以有更多或更少的记录,因此 SQL Server 上的数据中的一些数据是孤立的,我们有一个范围,因此在 SQL Server 中更新的数据不能在 db2 中更改,反之亦然。
我的问题是,当我们从 Db2 同步到 SQL Server 时,如何识别从 db2 中删除的记录,以便我们可以从 SQL Server 中删除这些记录,我们不想删除在 SQL Server 中创建但尚未删除的记录发送到 db2,我们有 114 个表,如果可以选择区分,我们无法维护标志。
感谢您的建议,我没有使用 CDC,而是维护 LOG 表中尚未同步到 DB2 的更改。
DELETE TGT
FROM [IGP].[LocationType] AS TGT
INNER JOIN #locationType SRC ON
TGT.[LocationTypeCode] = SRC.[LocationTypeCode];
Run Code Online (Sandbox Code Playgroud)
我首先将尚未同步到 DB2 的日志表数据插入 #locationType 临时表,然后从 IGP(登台 Db2 主数据)中删除它们,这样更新和删除就不会被 IGP 登台表数据(即 Db2)覆盖。主要的数据。
现在我需要处理 Db2 和 SQL Server 中不存在的插入,但它没有从日志表同步,我不应该删除它们,因为这会导致数据丢失,所以我使用下面的合并查询
MERGE INTO [dbo].[LocationType] AS TGT
USING [IGP].[LocationType] AS SRC
ON TGT.[LocationTypeCode] = SRC.[LocationTypeCode]
WHEN MATCHED AND (EXISTS
(SELECT TGT.[Description] EXCEPT SELECT SRC.[Description]))
THEN
UPDATE SET TGT.[LocationTypeCode] = SRC.[LocationTypeCode],
TGT.[Description] = SRC.[Description]
WHEN NOT MATCHED THEN
INSERT([LocationTypeCode], [Description])
VALUES([LocationTypeCode], [Description])
WHEN NOT MATCHED BY SOURCE
AND (EXISTS (SELECT TGT.[LocationTypeCode]
EXCEPT SELECT [LocationTypeCode] FROM #locationType)) THEN DELETE;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1445 次 |
| 最近记录: |