84 votes

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

Je essaie de faire cela:

ALTER TABLE CompanyTransactions DROP COLUMN Created

Mais je reçois ceci:

Msg 5074, Level 16, State 1, Line 2 L'objet 'DF__CompanyTr__Creat__0CDAE408' dépend de la colonne 'Created'. Msg 4922, Level 16, State 9, Line 2 ÉCHEC de ALTER TABLE DROP COLUMN Created car un ou plusieurs objets accèdent à cette colonne.

C'est une table en code first. Quelque part les migrations sont devenues toutes mélangées et j'essaie de revenir manuellement sur certains changements.

Je n'ai aucune idée de ce que c'est:

DF__CompanyTr__Creat__0CDAE408

0 votes

Ce n'est pas aussi simple que ça. Vous ne pourrez pas voir le nom de contrainte réel dans des environnements plus élevés.

162voto

SqlZim Points 31665

Vous devez supprimer les contraintes de la colonne avant de supprimer la colonne. Le nom auquel vous faites référence est une contrainte par défaut.

par exemple

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

33 votes

C'est frustrant que Entity Framework ne s'occupe pas de cela pour nous.

0 votes

@chakeda Je suis d'accord

0 votes

J'ai une situation similaire. Le problème est que mon application est déployée sur de nombreuses machines et que toutes les contraintes générées automatiquement ont des noms différents. Comment gérer ce genre de situation? Ajouter un long script qui génère du SQL à partir de information_schema à la migration ne semble pas être une option propre et bonne.

27voto

malloc4k Points 163

La réponse de @SqlZim est correcte mais juste pour expliquer pourquoi cela pourrait être arrivé. J'ai eu un problème similaire et cela était causé par 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 une CONTRAINTE. Et comme toute contrainte, elle a un identifiant. Et vous ne pouvez pas supprimer une colonne si elle est utilisée dans une CONTRAINTE.

Donc ce que vous pouvez réellement faire pour éviter ce genre de problèmes est de toujours 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 saurez au moins son nom à l'avance.

0 votes

Pour ajouter à la réponse de @malloc4k...vous pourriez développer le dossier "Contraintes" dans SQL Server 2016 et il montrera les noms des contraintes "par défaut".

9voto

vibs2006 Points 2150

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.

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

  1. Obtenez le nom de toutes les contraintes en utilisant sp_helpconstraint qui est un utilitaire de procédure stockée système - exécutez la commande suivante exec sp_helpconstraint ''
  2. Une fois que vous avez obtenu le nom de la contrainte, copiez ce nom de contrainte et exécutez l'instruction suivante : alter table drop constraint (Ce sera quelque chose comme ça ou un format similaire)
  3. Une fois que vous avez supprimé la contrainte, vous pouvez supprimer une ou plusieurs colonnes en utilisant la méthode conventionnelle, c'est-à-dire Alter table Drop column colonne1, colonne2, etc.

6voto

Jayant Wexoz Points 51

Lorsque vous modifiez la colonne datatype, vous devez changer la contrainte clé pour chaque base de données

  alter table CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];

0 votes

@user2513019 n'oubliez pas de voter pour cela, cela vous a aidé :)

4voto

ninbit Points 448

En plus de la réponse acceptée, si vous utilisez les migrations d'entités pour mettre à jour la base de données, vous devez ajouter cette ligne au début de la fonction Up() dans votre fichier de migration :

Sql("alter table dbo.CompanyTransactions drop constraint [df__CompanyTr__Creat__0cdae408];");

Vous pouvez trouver le nom de la contrainte dans l'erreur sur la console du gestionnaire de paquets nuget qui commence par FK_dbo.

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