在两个数据库之间同步数据时处理DelteBehavior.Restrict

19 浏览
0 Comments

在两个数据库之间同步数据时处理DelteBehavior.Restrict

我们需要在两个数据库之间保持一个特定表的同步。为此,存在一个后台作业。该过程如下:

  • 在db1中查询表中的所有数据
  • 将数据映射到db2中的EF Core实体
  • 清除db2中表中的现有行
  • 最后将映射实体插入db2中的表中

然而,该表与db2中的其他表存在关系。这些表通过外键引用它。FK的DeleteBehavior枚举设置为Restrict

因此,在步骤3中删除现有记录时会出现异常,因为其他表中存在依赖的实体。

为了解决这个问题,调用以下过程,临时禁用所有关系约束。然后,在删除和重新插入记录之后,将其恢复。

这个方法可以正常工作,但我觉得非常丑陋。你对此有什么看法?有人能提出更好的建议吗?

非常感谢任何建议或建议!以下是禁用FK约束的存储过程(来源here

DROP PROCEDURE [schema].[disableFks]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [schema].[disableFks]
AS
DECLARE @sql NVARCHAR(MAX) = N'';
with SCH as
(
    select SCHEMA_ID from sys.schemas where name in ('sch1', 'sch2', 'sch3')
)
, FKS AS 
(
    SELECT DISTINCT obj = QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) 
    FROM sys.foreign_keys
    WHERE sys.foreign_keys.schema_id in (select schema_id from SCH)
)
SELECT @sql += N'ALTER TABLE ' + obj + ' NOCHECK CONSTRAINT ALL;' FROM FKS;
EXEC sp_executesql @sql;
GO

0