SQL Server:使用FK删除表

时间:2010-03-09 17:24:37

标签: sql-server sql-server-2005 tsql sql-server-2008

在表格“A”上依赖于30个其他表格,通过FK到“A.Id”。

对于集成测试,我必须删除表并重新创建它以创建已定义的状态。由于依赖对象,它们似乎无法删除和重新创建表。错误消息是:

  

无法删除对象'dbo.A'   因为它是由FOREIGN引用的   关键约束

问题:

  • 如何删除并重新创建表格“A”
  • (或)是否有办法全局关闭架构依赖关系?
  • (或)有没有办法在删除和恢复表“A”之前备份(所有!)依赖项并在之后恢复所有依赖项?

6 个答案:

答案 0 :(得分:5)

浏览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。

答案 1 :(得分:4)

在Management Studio中,您可以右键单击该表并编写包含所有外键的CREATE和DROP脚本。


更具体地说,这将为您提供表所依赖的所有约束。但是,它没有提供依赖于此表的外键列表。因此,除了通过右键单击SMS中的表生成的脚本之外,还需要查找并编写所有外键的脚本。要获取它们的列表,您可以运行如下查询:

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'

对于其中的每一个,您都需要编写创建和删除脚本。您可以将drop添加到drop script的顶部,并将创建添加到create script的末尾。

答案 2 :(得分:3)

转到SSMS中的数据库并右键单击。选择任务,生成脚本。然后浏览选项并按照你想要的方式设置它们(Probaly只选择表中的外键并创建依赖对象并删除并重新创建,不要;在我面前选择但你会看到它们。然后选择表格你想要为FK编写脚本并将它们编写为文件脚本。打开文件并将drop语句分成一个文件,将创建语句分成另一个文件。现在你有可以运行的tweo文件自动执行你想要的运行时运行测试。我建议在运行第一次测试之前重新创建文件(如果它们自上次运行测试后已经更改),但不是每次测试都没有。

答案 3 :(得分:2)

在Sql Server Management Studio中展开表,展开Constraints文件夹。

记下您拥有的所有约束,以便重新创建它们。删除约束并删除表。重建表并重新创建约束。

答案 4 :(得分:2)

使用交易。 在测试结束时 - 回滚它。

答案 5 :(得分:0)

也许考虑在初始化测试设置中使用数据库维护虚拟服务器。启动VM,执行测试,然后丢弃已更改的VM。