Sql 使用Merge和';组合设置带有外键约束的表种子时出现的SSDT项目部署后问题;如果源不匹配,则删除';
我有一个SSDT项目,我使用MERGE语句在Script.PostDeployment.sql文件中为表设置种子。问题是,当我有相互依赖的查找表时,我从这些表合并脚本中删除记录,然后得到外键约束 假设我有两个查找表:Sql 使用Merge和';组合设置带有外键约束的表种子时出现的SSDT项目部署后问题;如果源不匹配,则删除';,sql,sql-server,sql-server-data-tools,Sql,Sql Server,Sql Server Data Tools,我有一个SSDT项目,我使用MERGE语句在Script.PostDeployment.sql文件中为表设置种子。问题是,当我有相互依赖的查找表时,我从这些表合并脚本中删除记录,然后得到外键约束 假设我有两个查找表: CREATE TABLE [dbo].[Parent] ( ParentId INT NOT NULL IDENTITY(1,1) ) CREATE TABLE [dbo].[Child] ( ChildId INT NOT NULL IDENTITY(1,1), P
CREATE TABLE [dbo].[Parent] (
ParentId INT NOT NULL IDENTITY(1,1)
)
CREATE TABLE [dbo].[Child] (
ChildId INT NOT NULL IDENTITY(1,1),
ParentId INT NOT NULL,
CONSTRAINT [FK_Parent_Child] FOREIGN KEY ([ParentId]) REFERENCES [dbo].[Parent] ([ParentId])
)
My Script.PostDeployment.sql脚本:
:r .\Parent.Seed.sql
:r .\Child.Seed.sql
SET IDENTITY_INSERT [dbo].[Child] ON
MERGE INTO [dbo].[Child] as child
USING (VALUES
(1,1)
,(2,2)
,(3,3)
) seed ([ChildId], [ParentId])
ON child.ChildId = seed.ChildId
WHEN MATCHED THEN
UPDATE SET [ParentId] = seed.[ParentId]
WHEN NOT MATCHED BY TARGET THEN
INSERT ([ChildId],[ParentId])
VALUES ([ChildId],[ParentId])
WHEN NOT MATCHED BY SOURCE THEN DELETE;
SET IDENTITY_INSERT [dbo].[Child] OFF
GO
我的Parent.Seed.sql脚本
SET IDENTITY_INSERT [dbo].[Parent] ON
MERGE INTO [dbo].[Parent] as parent
USING (VALUES (1,2,3)) seed ([ParentId])
ON parent.ParentId = seed.ParentId
WHEN MATCHED THEN
UPDATE SET [ParentId] = seed.[ParentId]
WHEN NOT MATCHED BY TARGET THEN
INSERT ([ParentId])
VALUES ([ParentId])
WHEN NOT MATCHED BY SOURCE THEN DELETE;
SET IDENTITY_INSERT [dbo].[Parent] OFF
GO
My Child.Seed.sql脚本:
:r .\Parent.Seed.sql
:r .\Child.Seed.sql
SET IDENTITY_INSERT [dbo].[Child] ON
MERGE INTO [dbo].[Child] as child
USING (VALUES
(1,1)
,(2,2)
,(3,3)
) seed ([ChildId], [ParentId])
ON child.ChildId = seed.ChildId
WHEN MATCHED THEN
UPDATE SET [ParentId] = seed.[ParentId]
WHEN NOT MATCHED BY TARGET THEN
INSERT ([ChildId],[ParentId])
VALUES ([ChildId],[ParentId])
WHEN NOT MATCHED BY SOURCE THEN DELETE;
SET IDENTITY_INSERT [dbo].[Child] OFF
GO
当第一次对数据库进行初始种子设定时,这很好,但是当您修改种子脚本时,因为现在让我们假设我要从Parent.seed.sql
脚本中删除3
记录,然后它会抛出一个外键约束错误,因为它试图从数据库中删除ParentId
Parent
表优先,这违反了[FK\u Parent\u Child]
约束
我如何管理这些查找表,因为它们总是随着应用程序的发展而变化?几乎没有选项:
您将能够在几个步骤中完成所有修改,并避免FK冲突,如插入父项、插入子项、删除子项、删除父项
这些都是很好的解决方案,我觉得自己很愚蠢,因为我以前没有想到它们。非常感谢。