web-dev-qa-db-fra.com

ALTER TABLE DROP COLUMN a échoué car un ou plusieurs objets accèdent à cette colonne

J'essaie de faire ceci:

ALTER TABLE CompanyTransactions DROP COLUMN Created

Mais je comprends ceci:

Msg 5074, niveau 16, état 1, ligne 2 L'objet 'DF__CompanyTr__Creat__0CDAE408' dépend de la colonne 'Créé'. Msg 4922, niveau 16, état 9, ligne 2 ALTER TABLE COLUMN DROP Créé a échoué car un ou plusieurs objets accèdent à cette colonne.

Ceci est une première table de code. D'une manière ou d'une autre, les migrations sont devenues complètement gâchées et j'essaie de restaurer manuellement certaines modifications.

J'ai non idée de quoi il s'agit:

DF__CompanyTr__Creat__0CDAE408
41
Casey Crookston

Vous devez supprimer le constraints de la colonne avant de supprimer la colonne. Le nom que vous référencez est un default constraint.

par exemple.

alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
alter table CompanyTransactions drop column [Created];
80
SqlZim

La réponse de @ SqlZim est correcte, mais juste pour expliquer pourquoi cela est probablement arrivé. J'ai eu un problème similaire et cela était dû à une chose très innocente: ajouter une valeur par défaut à une colonne

ALTER TABLE MySchema.MyTable ADD 
  MyColumn int DEFAULT NULL;

Mais dans le domaine de MS SQL Server, une valeur par défaut sur une colonne est un CONSTRAINT. Et comme chaque contrainte, il a un identifiant. Et vous ne pouvez pas supprimer une colonne si elle est utilisée dans un CONTRAINT.

Donc, ce que vous pouvez réellement faire pour éviter ce genre de problèmes est toujours de donner à vos contraintes par défaut un nom explicite, par exemple:

ALTER TABLE MySchema.MyTable ADD 
  MyColumn int NULL,
  CONSTRAINT DF_MyTable_MyColumn DEFAULT NULL FOR MyColumn;

Vous devrez toujours supprimer la contrainte avant de supprimer la colonne, mais vous devrez au moins, connaître son nom à l’avance.

14
malloc4k

Comme déjà écrit dans les réponses, vous devez supprimer les contraintes (créées automatiquement par SQL) liées à toutes les colonnes que vous essayez de supprimer.

Effectuer les étapes suivantes pour faire le nécessaire.

  1. Obtenir le nom de toutes les contraintes à l'aide de sp_helpconstraint, qui est un utilitaire de procédure stockée système - exécutez la commande suivante exec sp_helpconstraint '<your table name>'
  2. Une fois que vous avez obtenu le nom de la contrainte, copiez-le, puis exécutez l'instruction suivante, à savoir alter table <your_table_name> drop constraint <constraint_name_that_you_copied_in_1> (ce sera un format similaire ou similaire).
  3. Une fois que vous avez supprimé la contrainte, vous pouvez supprimer une ou plusieurs colonnes en utilisant la méthode conventionnelle i.e Alter table <YourTableName> Drop column column1, column2 etc.
3
vibs2006

Lorsque vous modifiez la colonne datatype, vous devez modifier constraint key pour chaque base de données.

  alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];
0
Jayant Wexoz

Vous devez faire quelques choses:

  1. Vous devez d’abord vérifier si la contrainte existe dans le schéma d’information.
  2. alors vous devez interroger en joignant les sys.default_constraints et sys.columns si les colonnes et default_constraints ont les mêmes id d'objet
  3. Lorsque vous vous joignez à l'étape 2, vous obtenez le nom de la contrainte à partir de default_constraints. Vous laissez tomber cette contrainte. Voici un exemple d'une de ces gouttes que j'ai faites.
-- 1. Remove constraint and drop column
IF EXISTS(SELECT *
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE TABLE_NAME = N'TABLE_NAME'
            AND COLUMN_NAME = N'LOWER_LIMIT')
   BEGIN
    DECLARE @sql NVARCHAR(MAX)
    WHILE 1=1
        BEGIN
            SELECT TOP 1 @sql = N'alter table [TABLE_NAME] 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('[TABLE_NAME]') AND c.name = N'LOWER_LIMIT'
            IF @@ROWCOUNT = 0
                BEGIN
                    PRINT 'DELETED Constraint on column LOWER_LIMIT'
                    BREAK
                END
        EXEC (@sql)
    END;
    ALTER TABLE TABLE_NAME DROP COLUMN LOWER_LIMIT;
    PRINT 'DELETED column LOWER_LIMIT'
   END
ELSE
   PRINT 'Column LOWER_LIMIT does not exist'
GO
0
Akash Yellappa