删除并重新创建引用多个列的外键



我正在尝试使用来自生产服务器的数据刷新开发服务器,但这无法通过简单的还原来完成,因为开发环境包含我们需要保留的生产环境中不的对象。所以我要做的是截断需要刷新的表,然后插入数据。我为此创建了一个过程,它一直工作到我们到达外键。

我继承的数据库写得不是很好,在大多数表中都有几个主键列。我在看这个问题 不能截断表,因为它被外键约束引用?并将 @peter-szanto 和 @marc-2377 提供的最佳解决方案合并到存储过程中,只要插入 #FKs sys.foreign_key_columns中有一个唯一的约束,就可以很好地工作。 使用脚本会导致错误

"引用的表中没有主键或候选键">

在某些表上,因为它们引用具有多个主键列的表作为一个外键。

按原样的代码返回这些内容以重新创建表FK_stmnt中的 fks

ALTER TABLE [dbo].[sometable] WITH NOCHECK 
ADD CONSTRAINT [sometable$othertable__12345] 
FOREIGN KEY([fk1]) REFERENCES [dbo].[othertable] ([pk1])
ALTER TABLE [dbo].[sometable] WITH NOCHECK 
ADD CONSTRAINT [sometable$othertable__12345] 
FOREIGN KEY([fk2]) REFERENCES [dbo].[othertable] ([pk2])
ALTER TABLE [dbo].[sometable] WITH NOCHECK 
ADD CONSTRAINT [sometable$othertable__12345] 
FOREIGN KEY([fk3]) REFERENCES [dbo].[othertable] ([pk3])
ALTER TABLE [dbo].[sometable] WITH NOCHECK 
ADD CONSTRAINT [sometable$othertable__12345] 
FOREIGN KEY([fk4]) REFERENCES [dbo].[othertable] ([pk4])
ALTER TABLE [dbo].[sometable] WITH NOCHECK 
ADD CONSTRAINT [sometable$othertable__12345] 
FOREIGN KEY([fk5]) REFERENCES [dbo].[othertable] ([pk5])

需要返回的结果为

ALTER TABLE [dbo].[sometable] WITH NOCHECK 
ADD CONSTRAINT [sometable$othertable__12345] 
FOREIGN KEY ([fk1], [fk2], [fk3], [fk4], [fk5]) 
REFERENCES [dbo].[othertable] ([pk1], [pk2], [pk3], [pk4], [pk5])

也就是说,对于每个 SomeTable$othertable__12345 约束,将列组合在一个语句中。

有什么想法吗?

以下 SQL 将列出所有 FK、表名、FK 键、引用的表和引用的键...如果有多个键,则为逗号分隔的列表。

这只是我的常用工具包中的SQL,并没有真正针对您的确切问题量身定制,但是您应该能够对其进行调整以生成所需的内容。

SELECT fkeys.[name] AS FKName, 
OBJECT_NAME(fkeys.parent_object_id) AS TableName,
(SELECT STUFF((SELECT ',' + c.[name]
FROM sys.foreign_keys fk INNER JOIN sys.tables t ON fk.parent_object_id = t.object_id
INNER JOIN sys.columns as c ON t.object_id = c.object_id
INNER JOIN sys.foreign_key_columns AS fc ON c.column_id = fc.parent_column_id 
AND fc.constraint_object_id = fk.object_id 
AND fc.parent_object_id = fk.parent_object_id 
WHERE fk.[name] = fkeys.[name]
FOR XML PATH ('')), 1, 1, '')) AS FKFolumns,
OBJECT_NAME(fkeys.referenced_object_id) AS ReferencedTableName,
(SELECT STUFF((SELECT ',' + c.[name]
FROM sys.foreign_keys fk INNER JOIN sys.tables t ON fk.referenced_object_id = t.object_id
INNER JOIN sys.columns as c ON t.object_id = c.object_id
INNER JOIN sys.foreign_key_columns AS fc ON c.column_id = fc.referenced_column_id 
AND fc.constraint_object_id = fk.object_id 
AND fc.referenced_object_id = fk.referenced_object_id 
WHERE fk.[name] = fkeys.[name]
FOR XML PATH ('')), 1, 1, '')) AS ReferencedFKFolumns
FROM sys.foreign_keys fkeys
ORDER BY FKName;

要让一个表中的多列与另一个表的多列有 fk 关系,此语法有效:

alter table dbo.x
add constraint FK_A foreign key ([SalesOrderID] ,[SalesOrderDetailID])
references dbo.y1 ([SalesOrderID] , [SalesOrderDetailID])

在表 dbo.y1中,这两列是 dbo.y1 上的主键。

相关内容

  • 没有找到相关文章

最新更新