【问题标题】:How can I drop all the default constraints constraints on a table如何删除表上的所有默认约束约束
【发布时间】:2009-04-20 07:31:07
【问题描述】:

如何在 SQL 2005 中删除属于特定表的所有默认约束?

【问题讨论】:

  • 我已经删除了我的答案,因为我不能 100% 确定并且我无法测试。
  • 您自己的解决方案似乎没问题,不是吗?

标签: sql-server sql-server-2005 constraints


【解决方案1】:

一个解决方案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

【讨论】:

  • 将 OBJECT_NAME 更改为 PARENT_OBJECT_NAME 效果很好。
  • 很好的查询。不过我会更正一下。游标的声明应该是:SELECT NAME, parent_object_id FROM SYS.OBJECTS WHERE TYPE = 'D' AND parent_object_id = OBJECT_ID('Mytable')
【解决方案2】:

我知道这是旧的,但我只是在谷歌搜索时发现它。 下面是一个在 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

【讨论】:

  • 这只会删除第一个找到的约束(至少它对我做了什么)。您必须遍历所有这些。
  • @Ioana Marcu:在 SQL 2008 数据库上为我工作。对于名为“Account”的表,我得到一个类似于下面的字符串 alter table Account drop constraint DF__Account__Account__4865BE2A;alter table Account drop constraint DF__Account__Account__4959E263 即一堆串联的删除语句
  • @IoanaMarcu 选择语句迭代并将它们全部连接到一个搅拌中
  • 这不能回答所提出的问题
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您为什么要这样做?删除约束是一项非常激烈的操作,不仅会影响您的流程,还会影响所有用户。也许您的问题可以通过其他方式解决。如果您不是系统的 dba,您应该非常认真地考虑是否应该这样做。 (当然,在大多数系统中,dba 不会允许其他任何人拥有执行此类操作的权限。)

    【讨论】:

    • 我正在使用几个需要支持 Unicode 的字段,但我没有找到任何其他方法。因此,我正在更改列的数据类型,并正在删除约束并再次创建它们......
    • 据我所知,这不是一个答案。更多的警告,最好通过评论给出?
    猜你喜欢
    • 2012-06-18
    • 1970-01-01
    • 2014-04-16
    • 2012-06-02
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多