Как удалить столбец с объектными зависимостями в SQL Server 2008? - PullRequest
25 голосов
/ 12 февраля 2010

Сообщение об ошибке, которое я получаю при попытке удалить столбец:

Объект 'defEmptyString' зависит от столбца 'fkKeywordRolleKontakt'.

Сообщение 5074, Уровень 16, Состояние 1, Строка 43

ALTER TABLE DROP COLUMN fkKeywordRolleKontakt не выполнен, так как один или несколько объектов имеют доступ к этому столбцу.

Я уже пытался найти ограничения по умолчанию, как описано здесь: SQL Server 2005 отбрасываемый столбец с ограничениями

К сожалению, безуспешно :( Возвращаемая строка:

fkKeywordRolleKontakt 2 814625945 0 defEmptyString

И я не могу удалить ни fkKeywordRolleKontakt, ни defEmptyString.

Как правильно избавиться от этой зависимости?

РЕДАКТИРОВАТЬ: Возможно, это тоже важно. Столбец fkKeywordRolleKontakt имеет тип udKeyword (nvarchar (50)) по умолчанию dbo.defEmptyString.


Редактировать 2: Решено

Я мог бы решить проблему сейчас. Извините, я не скопировал полное сообщение об ошибке, которое было:

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

Я мог бы создать сценарий для удаления столбца, щелкнув правой кнопкой мыши запись столбца (dbo.tlkpRolleKontakt> Столбцы> fkKeywordRolleKontakt) (в MSSQL Server Manager), выбрав Изменить и удалив столбец. Затем Table Designer> Generate Change Script сгенерировал необходимые команды:

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

Вот и все:)

Ответы [ 5 ]

36 голосов
/ 12 февраля 2010

Вы пробовали сначала:

ALTER TABLE <tablename> DROP CONSTRAINT defEmptyString;

7 голосов
/ 07 октября 2015

удалить ограничение , которое зависит от этого столбца с

ALTER TABLE TableName DROP CONSTRAINT dependent_constraint

Тогда столбец удаления:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME

pendent_constraint : это ограничение отображается в ошибке при попытке удалить зависимый столбец.

Пример: попытка отбросить какой-нибудь столбец IsDeleted2

Error

Объект 'DF__Employees__IsDel__15502E78' зависит от столбца 'IsDeleted2'.

ALTER TABLE DROP COLUMN IsDeleted2 не удалось, так как один или несколько объектов получить доступ к этому столбцу.

Ошибка ясно указывает на то, что нам нужно удалить DF__Employees__IsDel__15502E78 ограничение

ALTER TABLE Employess 
DROP CONSTRAINT DF__Employees__IsDel__15502E78;

Столбец удаления: ALTER TABLE Employess DROP COLUMN IsDelted2

3 голосов
/ 09 июня 2016

Я мог бы решить проблему сейчас. Извините, я не скопировал полное сообщение об ошибке, которое было:

Сообщение 5074, Уровень 16, Состояние 1, Строка 1
Объект «defEmptyString» зависит от столбца «fkKeywordRolleKontakt».

Сообщение 5074, Уровень 16, Состояние 1, Строка 1
Объект «FK_tlkpRolleKontakt_tlkpKeyword» зависит от столбца 'fkKeywordRolleKontakt'.
Сообщение 4922, уровень 16, состояние 9, строка 1: ALTER TABLE DROP COLUMN fkKeywordRolleKontakt не выполнен, поскольку один или другие объекты имеют доступ к этому столбцу.

Я мог бы создать сценарий для удаления столбца, щелкнув правой кнопкой мыши запись столбца (dbo.tlkpRolleKontakt> Столбцы> fkKeywordRolleKontakt) (в MSSQL Server Manager), выбрав Изменить и удалив столбец. Затем Table Designer> Generate Change Script сгенерировал необходимые команды:

ALTER TABLE dbo.tlkpRolleKontakt
    DROP CONSTRAINT FK_tlkpRolleKontakt_tlkpKeyword
EXECUTE sp_unbindefault N'dbo.tlkpRolleKontakt.fkKeywordRolleKontakt'
ALTER TABLE dbo.tlkpRolleKontakt
    DROP COLUMN fkKeywordRolleKontakt
2 голосов
/ 13 февраля 2010

используйте этот скрипт для отмены проверки ограничения:

ALTER TABLE  @tablename  NOCHECK CONSTRAINT  @constraintname 
0 голосов
/ 25 марта 2014

Я столкнулся с более простым решением.

  1. УДАЛИТЬ данные этого столбца.
  2. Как только столбец не имеет значения внутри, выполните -

ALTER TABLE <table_name> DROP COLUMN <column_name>

Таким образом, столбец легко удаляется.

P.S. Это головная боль, если в столбце слишком много данных.

...