简体   繁体   中英

How can I drop all the default constraints constraints on a table

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

One solution from a search : (Edited for Default constraints)

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

I know this is old, but I just found it when googling. A solution that works for me in SQL 2008 (not sure about 2005) without resorting to cursors is below :

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

Script posted by gbn does not work for me, so I'm using a modified version:

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

Just why do you want to do this? Dropping constraints is a pretty drastic action and affects all users not just your process. Maybe your problem can be solved some other way. If you aren't the dba of the system, you should think very hard about whether you should do this. (Of course in most systems, a dba wouldn't allow anyone else the permissions to do such a thing.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM