web-dev-qa-db-fra.com

Comment supprimer une colonne avec des dépendances d'objet dans SQL Server 2008?

Le message d'erreur que j'obtiens en essayant de supprimer une colonne:

L'objet 'defEmptyString' dépend de la colonne 'fkKeywordRolleKontakt'.

Msg 5074, niveau 16, état 1, ligne 43

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

J'ai déjà essayé de trouver les contraintes par défaut, comme décrit ici: colonne de dépôt SQL Server 2005 avec contraintes

Malheureusement sans succès :( La ligne retournée est:

fkKeywordRolleKontakt 2 814625945 0 defEmptyString

Et je ne peux supprimer ni fkKeywordRolleKontakt ni defEmptyString.

Quelle est la bonne façon de se débarrasser de cette dépendance?

EDIT: C'est peut-être aussi important. La colonne fkKeywordRolleKontakt est de type udKeyword (nvarchar (50)) avec par défaut dbo.defEmptyString.


Edit 2: Résolu

Je pourrais résoudre le problème maintenant. Je suis désolé, je n'ai pas copié le message d'erreur complet, qui était:

Msg 5074, Level 16, State 1, Line 1
The object 'defEmptyString' is dependent on column 'fkKeywordRolleKontakt'.
Msg 5074, Level 16, State 1, Line 1
The object 'FK_tlkpRolleKontakt_tlkpKeyword' is dependent on column 'fkKeywordRolleKontakt'.
Msg 4922, Level 16, State 9, Line 1
ALTER TABLE DROP COLUMN fkKeywordRolleKontakt failed because one or more objects access this column.

Je pouvais générer un script pour supprimer la colonne en cliquant avec le bouton droit sur l'entrée de colonne (dbo.tlkpRolleKontakt> Colonnes> fkKeywordRolleKontakt) (dans le Gestionnaire de serveur MSSQL), en sélectionnant Modifier et en supprimant la colonne. Ensuite, Table Designer> Generate Change Script a généré les commandes nécessaires:

ALTER TABLE dbo.tlkpRolleKontakt
    DROP CONSTRAINT FK_tlkpRolleKontakt_tlkpKeyword
EXECUTE sp_unbindefault N'dbo.tlkpRolleKontakt.fkKeywordRolleKontakt'
ALTER TABLE dbo.tlkpRolleKontakt
    DROP COLUMN fkKeywordRolleKontakt

C'est ça :)

26
Simon A. Eugster

Je pourrais résoudre le problème maintenant. Je suis désolé, je n'ai pas copié le message d'erreur complet, qui était:

Msg 5074, niveau 16, état 1, ligne 1
L'objet 'defEmptyString' dépend de la colonne 'fkKeywordRolleKontakt'.

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

Je pouvais générer un script pour supprimer la colonne en cliquant avec le bouton droit sur l'entrée de colonne (dbo.tlkpRolleKontakt> Colonnes> fkKeywordRolleKontakt) (dans le Gestionnaire de serveur MSSQL), en sélectionnant Modifier et en supprimant la colonne. Ensuite, Table Designer> Generate Change Script a généré les commandes nécessaires:

ALTER TABLE dbo.tlkpRolleKontakt
    DROP CONSTRAINT FK_tlkpRolleKontakt_tlkpKeyword
EXECUTE sp_unbindefault N'dbo.tlkpRolleKontakt.fkKeywordRolleKontakt'
ALTER TABLE dbo.tlkpRolleKontakt
    DROP COLUMN fkKeywordRolleKontakt
3
Simon A. Eugster

Avez-vous essayé en premier:

ALTER TABLE <tablename> DROP CONSTRAINT defEmptyString;

?

36
Aaron Bertrand

supprimez la contrainte qui dépend de cette colonne avec

ALTER TABLE TableName DROP CONSTRAINT dependent_constraint

puis déposer la colonne:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME

dependent_constraint: cette contrainte est affichée dans l'erreur lorsque nous essayons de supprimer la colonne dépendante.

Exemple: essayer de supprimer une colonne IsDeleted2

Erreur

L'objet 'DF__Employees__IsDel__15502E78' dépend de la colonne 'IsDeleted2'.

Échec de ALTER TABLE DROP COLUMN IsDeleted2 car un ou plusieurs objets accèdent à cette colonne.

L'erreur indique clairement que nous devons supprimer DF__Employees__IsDel__15502E78 contrainte

ALTER TABLE Employess 
DROP CONSTRAINT DF__Employees__IsDel__15502E78;

Supprimer la colonne:ALTER TABLE Employess DROP COLUMN IsDelted2

7
Jinna Balu

utilisez ce script pour annuler la vérification de la contrainte:

ALTER TABLE  @tablename  NOCHECK CONSTRAINT  @constraintname 
2
masoud ramezani

Je suis tombé sur une solution plus simple.

  1. SUPPRIMEZ les données de cette colonne.
  2. Une fois que la colonne n'a aucune valeur à l'intérieur -

ALTER TABLE <table_name> DROP COLUMN <column_name>

De cette façon, la colonne est facilement supprimée.

P.S - C'est un casse-tête si vous avez des quantités extrêmes de données dans la colonne.

0
Sandman