Come posso eliminare tutti i vincoli predefiniti che appartengono a una determinata tabella in SQL 2005?Come posso eliminare tutti i vincoli di vincoli predefiniti su una tabella
risposta
Una soluzione from a search: (a cura per i vincoli di default)
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
cambiando OBJECT_NAME in PARENT_OBJECT_NAME ha funzionato bene grazie. –
Buona domanda. Comunque farei una correzione. La dichiarazione del cursore dovrebbe essere: SELECT NAME, parent_object_id FROM SYS.OBJECTS WHERE TYPE = 'D' AND parent_object_id = OBJECT_ID ('Mytable') –
Proprio perché vuoi fare questo? Eliminare i vincoli è un'azione piuttosto drastica e riguarda tutti gli utenti non solo il processo. Forse il tuo problema può essere risolto in un altro modo. Se non sei il dba del sistema, dovresti pensare molto seriamente se dovresti farlo. (Naturalmente nella maggior parte dei sistemi, un dba non consentirebbe a nessun altro i permessi di fare una cosa del genere.)
Sto usando Diversi campi che devono supportare Unicode e non trovo nessun altro modo di facendo questo. quindi sto cambiando il tipo di dati delle colonne e nel processo di rilascio dei vincoli e la creazione di nuovo ....... –
So che questo è vecchio, ma l'ho appena trovato su google. una soluzione che funziona per me in SQL 2008 (non sicuro circa 2005) senza ricorrere a cursori è qui sotto:
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
Questo elimina solo il primo vincolo trovato (almeno questo è quello che mi ha fatto). Devi iterare attraverso tutti loro. –
@Ioana Marcu: funziona per me su un database SQL 2008. Ricevo una stringa simile a quella seguente per la tabella denominata "Account" alter table Vincolo di caduta account DF__Account__Account__4865BE2A; alter table Vincolo di caduta account DF__Account__Account__4959E263 cioè un gruppo di istruzioni di rilascio concatenate – PabloInNZ
Ho cancellato la mia risposta dato che io sono sicuro al 100% e io non sono in grado di testare. – Peter
La tua soluzione sembra ok, no? – Peter