【发布时间】:2009-04-20 07:31:07
【问题描述】:
如何在 SQL 2005 中删除属于特定表的所有默认约束?
【问题讨论】:
-
我已经删除了我的答案,因为我不能 100% 确定并且我无法测试。
-
您自己的解决方案似乎没问题,不是吗?
标签: sql-server sql-server-2005 constraints
如何在 SQL 2005 中删除属于特定表的所有默认约束?
【问题讨论】:
标签: sql-server sql-server-2005 constraints
一个解决方案from a search:(针对默认约束编辑)
SET NOCOUNT ON
DECLARE @constraintname SYSNAME, @objectid int,
@sqlcmd VARCHAR(1024)
DECLARE CONSTRAINTSCURSOR CURSOR FOR
SELECT NAME, object_id
FROM SYS.OBJECTS
WHERE TYPE = 'D' AND @objectid = OBJECT_ID('Mytable')
OPEN CONSTRAINTSCURSOR
FETCH NEXT FROM CONSTRAINTSCURSOR
INTO @constraintname, @objectid
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @sqlcmd = 'ALTER TABLE ' + OBJECT_NAME(@objectid) + ' DROP CONSTRAINT ' + @constraintname
EXEC( @sqlcmd)
FETCH NEXT FROM CONSTRAINTSCURSOR
INTO @constraintname, @objectid
END
CLOSE CONSTRAINTSCURSOR
DEALLOCATE CONSTRAINTSCURSOR
【讨论】:
我知道这是旧的,但我只是在谷歌搜索时发现它。 下面是一个在 SQL 2008(不确定 2005 年)中适用于我而不使用游标的解决方案:
declare @sql nvarchar(max)
set @sql = ''
select @sql = @sql + 'alter table YourTable drop constraint ' + name + ';'
from sys.default_constraints
where parent_object_id = object_id('YourTable')
AND type = 'D'
exec sp_executesql @sql
【讨论】:
gbn 发布的脚本对我不起作用,所以我使用的是修改后的版本:
SET NOCOUNT ON
DECLARE @DfId INT, @TableId INT,
@SqlCmd VARCHAR(1024)
DECLARE DFCONSTRAINTCUR CURSOR FOR
SELECT [parent_object_id] TABLE_ID, [object_id] DF_ID
FROM SYS.OBJECTS
where parent_object_id = OBJECT_ID('<table name>')
and [TYPE] = 'D'
OPEN DFCONSTRAINTCUR
FETCH NEXT FROM DFCONSTRAINTCUR
INTO @TableId, @DfId
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @sqlcmd = 'ALTER TABLE ' + OBJECT_NAME(@TableId) + ' DROP CONSTRAINT ' + OBJECT_NAME(@DfId)
EXEC(@sqlcmd)
FETCH NEXT FROM DFCONSTRAINTCUR
INTO @TableId, @DfId
END
CLOSE DFCONSTRAINTCUR
DEALLOCATE DFCONSTRAINTCUR
【讨论】:
您为什么要这样做?删除约束是一项非常激烈的操作,不仅会影响您的流程,还会影响所有用户。也许您的问题可以通过其他方式解决。如果您不是系统的 dba,您应该非常认真地考虑是否应该这样做。 (当然,在大多数系统中,dba 不会允许其他任何人拥有执行此类操作的权限。)
【讨论】: