SQL Server:使用FK删除表

Rob*_*ert 11 t-sql sql-server sql-server-2005 sql-server-2008

在表"A"上依赖于30个其他表格通过FK到"A.Id".

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

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

问题(S):

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

Yoo*_*eek 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)
Run Code Online (Sandbox Code Playgroud)

有了这个,或者有一些变化,你可以找到外键,删除它们,做你的东西,然后重新创建外键.

我应该补充一点,我知道这适用于SQL2005和SQL2008.我真的不知道它是否适用于SQL2000/MSDE.


HLG*_*GEM 3

转到 SSMS 中的数据库并右键单击。选择任务,生成脚本。然后浏览选项并按照您想要的方式设置它们(可能只选择表中的外键并创建依赖对象并删除并重新创建,不要在我面前有选项,但您会看到它们。然后选择您的表想要为 FK 编写脚本并将其编写到一个文件中。打开该文件并将 drop 语句分离到一个文件中,将 create 语句分离到另一个文件中。现在您有了 tweo 文件,您可以运行 do 自动执行您想要的操作,只要您运行 run我建议在运行第一个测试之前重新创建文件(以防它们自上次运行测试以来发生了更改),但不是针对每个单独的测试。