177 votes

Comment faire pour supprimer la colonne avec la contrainte?

Comment faire pour supprimer une colonne, qui est d'avoir contrainte par Défaut dans SQL Server 2008?

Ma requête est

alter table tbloffers
drop column checkin

Je suis d'erreur ci-dessous

ALTER TABLE DROP COLONNE de l'enregistrement a échoué en raison d'un ou de plusieurs objets accéder à cette colonne.

Quelqu'un peut-il corriger ma requête pour supprimer une colonne avec la contrainte?

283voto

Oleg Dok Points 12155

D'abord, vous devez déposer la problématique DEFAULT constraint, après que vous pouvez vous déplacer la colonne

alter table tbloffers drop constraint [ConstraintName]
GO
alter table tbloffers drop column checkin

Mais l'erreur peut apparaître à partir d'autres raisons - par exemple, la fonction définie par l'utilisateur ou la vue d' SCHEMABINGING option pour eux.

UPD: Entièrement automatisé de la chute des contraintes de script:

DECLARE @sql NVARCHAR(MAX)
WHILE 1=1
BEGIN
    SELECT TOP 1 @sql = N'alter table tbloffers drop constraint ['+dc.NAME+N']'
    from sys.default_constraints dc
    JOIN sys.columns c
        ON c.default_object_id = dc.object_id
    WHERE 
        dc.parent_object_id = OBJECT_ID('tbloffers')
    AND c.name = N'checkin'
    IF @@ROWCOUNT = 0 BREAK
    EXEC (@sql)
END

169voto

Chris Halcrow Points 907

Voici une autre façon de déposer une contrainte par défaut avec un nom inconnu sans avoir à exécuter une requête distincte pour obtenir le nom de la contrainte:

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

30voto

Martin Smith Points 174101

Vous pouvez également déposer la colonne et la contrainte(s) dans un seul énoncé plutôt qu'individuellement.

CREATE TABLE #T
  (
     Col1 INT CONSTRAINT UQ UNIQUE CONSTRAINT CK CHECK (Col1 > 5),
     Col2 INT
  )

ALTER TABLE #T DROP CONSTRAINT UQ , 
                    CONSTRAINT CK, 
                    COLUMN Col1


DROP TABLE #T 

28voto

marc_s Points 321990

Trouver le défaut de la contrainte avec cette requête ici:

SELECT
    df.name 'Constraint Name' ,
    t.name 'Table Name',
    c.NAME 'Column Name'
FROM sys.default_constraints df
INNER JOIN sys.tables t ON df.parent_object_id = t.object_id
INNER JOIN sys.columns c ON df.parent_object_id = c.object_id AND df.parent_column_id = c.column_id

Cela vous donne le nom de la contrainte par défaut, ainsi que la table et de la colonne nom.

Lorsque vous avez cette information, vous devez d'abord supprimer la contrainte par défaut:

ALTER TABLE dbo.YourTable
DROP CONSTRAINT name-of-the-default-constraint-here

et puis vous pouvez déposer la colonne

ALTER TABLE dbo.YourTable DROP COLUMN YourColumn

1voto

Ewald Stieger Points 603

J'ai eu le même:

ALTER TABLE DROP COLONNE a échoué en raison d'un ou de plusieurs objets d'accès cette colonne message.

Ma colonne a un indice qui devaient être supprimés en premier. À l'aide de sys.index a fait le tour:

DECLARE @sql VARCHAR(max)

SELECT @sql = 'DROP INDEX ' + idx.NAME + ' ON tblName'
FROM sys.indexes idx
INNER JOIN sys.tables tbl ON idx.object_id = tbl.object_id
INNER JOIN sys.index_columns idxCol ON idx.index_id = idxCol.index_id
INNER JOIN sys.columns col ON idxCol.column_id = col.column_id
WHERE idx.type <> 0
    AND tbl.NAME = 'tblName'
    AND col.NAME = 'colName'

EXEC sp_executeSql @sql
GO

ALTER TABLE tblName
DROP COLUMN colName

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X