Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用Merge和';组合设置带有外键约束的表种子时出现的SSDT项目部署后问题;如果源不匹配,则删除';_Sql_Sql Server_Sql Server Data Tools - Fatal编程技术网

Sql 使用Merge和';组合设置带有外键约束的表种子时出现的SSDT项目部署后问题;如果源不匹配,则删除';

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

我有一个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),
  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冲突,如插入父项、插入子项、删除子项、删除父项

  • 在脚本之前禁用FK约束,在脚本之后重新启用

  • 我不确定这在您的情况下是否可行,您可以尝试软删除(在表中包括已删除的列)


  • 这些都是很好的解决方案,我觉得自己很愚蠢,因为我以前没有想到它们。非常感谢。