表"A"通过外键“A.Id”与其他约30个表相关联。
为了进行集成测试,我必须删除并重新创建该表以创建一个定义的状态。由于存在依赖对象,似乎没有办法删除和重新创建该表。错误信息如下:
无法删除对象“dbo.A”,因为它被FOREIGN KEY约束引用
问题:
- 我该如何删除并重新创建表"A"?
- (或者)是否有一种全局关闭架构依赖项的方法?
- (或者)是否有一种在删除和恢复表"A"之前备份(全部!)依赖项并在之后还原所有依赖项的方法?
表"A"通过外键“A.Id”与其他约30个表相关联。
为了进行集成测试,我必须删除并重新创建该表以创建一个定义的状态。由于存在依赖对象,似乎没有办法删除和重新创建该表。错误信息如下:
无法删除对象“dbo.A”,因为它被FOREIGN KEY约束引用
问题:
探索 sys.foreign_key_columns
系统表。以下是一个例子,它将在给定一个表的情况下告诉你哪些列与另一个表相关联:
DECLARE @tableName VARCHAR(255)
SET @tableName = 'YourTableName'
SELECT OBJECT_NAME(fkc.constraint_object_id) AS 'FKName', OBJECT_NAME(fkc.[referenced_object_id]) AS 'FKTable', c2.[name] AS 'FKTableColumn', @tableName AS 'Table', c1.[name] AS 'TableColumn'
FROM sys.foreign_key_columns as fkc
JOIN sys.columns AS c1 ON c1.[object_id] = fkc.[parent_object_id] AND c1.[column_id] = fkc.[parent_column_id]
JOIN sys.columns AS c2 ON c2.[object_id] = fkc.[referenced_object_id] AND c2.[column_id] = fkc.[referenced_column_id]
WHERE fkc.[parent_object_id] = OBJECT_ID(@tableName)
ORDER BY OBJECT_NAME(fkc.constraint_object_id)
通过这种方式或其变体,您可以找出外键,删除它们,进行操作,然后重新创建外键。
我应该补充说明,我知道这适用于SQL2005和SQL2008。我不确定它是否适用于SQL2000 / MSDE。
select FKConstraint.TABLE_NAME, FKConstraint.CONSTRAINT_NAME
from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As UniqueConstraint
On UniqueConstraint.CONSTRAINT_NAME = INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_NAME
Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As FKConstraint
On FKConstraint.CONSTRAINT_NAME = INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS.CONSTRAINT_NAME
Where UniqueConstraint.TABLE_NAME = 'TableA'
在SSMS中进入数据库并右键单击。选择任务,生成脚本。然后按照您的要求设置选项(可能只选择表中的外键并创建相关对象以及删除和重新创建,我没有选项在手边,但您会看到它们)。然后选择要为其编写FK脚本的表并将其脚本化到一个文件中。打开文件并将删除语句分离到一个文件中,将创建语句分离到另一个文件中。现在您有两个文件可以在每次运行测试时自动执行所需操作。我建议在第一次运行测试之前重新创建文件(以防它们与上次运行测试时发生了更改),但不需要每个单独的测试都重新创建。
在 Sql Server Management Studio 中展开表,展开 Constraints 文件夹。
记录下您拥有的任何约束条件,以便您可以重新创建它们。删除约束并删除表。重建表格并重新创建约束。
使用事务。 在测试结束时 - 回滚它。