【发布时间】:2009-09-17 12:46:45
【问题描述】:
如何使用 T-SQL 在 SQL Server 2000 中删除表上的所有外键约束?
【问题讨论】:
标签: sql sql-server tsql
如何使用 T-SQL 在 SQL Server 2000 中删除表上的所有外键约束?
【问题讨论】:
标签: sql sql-server tsql
给你:(没有在SQL2000上测试过,但应该没问题)
生成“禁用”:
SELECT 'IF EXISTS (SELECT * FROM sys.foreign_keys
WHERE object_id = OBJECT_ID(N''[dbo].' + FK +''')
AND parent_object_id = OBJECT_ID(N''[dbo].' + PT + '''))
ALTER TABLE ' + PT + ' NOCHECK CONSTRAINT ' + FK + ';'
FROM
(SELECT
OBJECT_NAME(constraint_object_id) as FK,
OBJECT_NAME(parent_object_id) as PT
FROM [sys].[foreign_key_columns] ) T
ORDER BY FK
生成“启用”:
SELECT 'ALTER TABLE ' + PT + ' WITH CHECK CHECK CONSTRAINT ' + FK + ';'
FROM
(SELECT
OBJECT_NAME(constraint_object_id) as FK,
OBJECT_NAME(parent_object_id) as PT
FROM [sys].[foreign_key_columns] ) T
ORDER BY FK
更新:糟糕,我以为您希望所有表格都使用它 :) 您可以在上面为您的单个表格进行修改。
【讨论】:
如果这里可以选择简单地禁用约束,您可以使用:
ALTER TABLE myTable NOCHECK CONSTRAINT all
然后您可以使用以下命令重新打开它们:
ALTER TABLE myTable WITH CHECK CHECK CONSTRAINT all
如果您想禁用所有表中的约束,您可以使用:
-- disable all constraints
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
-- enable all constraints
exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
更多问题:Can foreign key constraints be temporarily disabled using TSQL?
但如果您需要永久删除约束,您可以使用this script posted on databasejurnal.com。
稍微修改一下,只去掉外键
create proc sp_drop_fk_constraints
@tablename sysname
as
-- credit to: douglas bass
set nocount on
declare @constname sysname,
@cmd varchar(1024)
declare curs_constraints cursor for
select name
from sysobjects
where xtype in ('F')
and (status & 64) = 0
and parent_obj = object_id(@tablename)
open curs_constraints
fetch next from curs_constraints into @constname
while (@@fetch_status = 0)
begin
select @cmd = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @constname
exec(@cmd)
fetch next from curs_constraints into @constname
end
close curs_constraints
deallocate curs_constraints
return 0
【讨论】:
SELECT 'ALTER TABLE ' + OBJECT_SCHEMA_NAME(parent_object_id) + '.' + OBJECT_NAME(parent_object_id) + ' DROP CONSTRAINT ' + [name] FROM sys.foreign_keys WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo' AND OBJECT_NAME(referenced_object_id) = '<table>'
我想您会发现在 SQL Server 2000 中删除表上的约束没有简单的方法。也就是说,有很多人编写了可以识别和删除/禁用/重新创建外键约束的脚本.一个例子是http://www.mssqltips.com/tip.asp?tip=1376 - 但我还没有在 SQL Server 2000 上测试过。
编辑:这是另一个 example 为您生成删除/创建脚本。
【讨论】: