ALTER TABLE для зависимого столбца - PullRequest
43 голосов
/ 26 марта 2012

Я пытаюсь изменить тип данных столбца первичного ключа для tinyint из int. Этот столбец является внешним ключом в других таблицах. Итак, я получаю следующую ошибку:


Сообщение 5074, Уровень 16, Состояние 1, Строка 1 Объект 'PK_User_tbl' является зависит от столбца 'appId'. Сообщение 5074, Уровень 16, Состояние 1, Строка 1 Объект 'FK_Details_tbl_User_tbl' зависит от столбца 'appId'. Msg 5074, Уровень 16, Состояние 1, Строка 1 Объект 'FK_Log_tbl_User_tbl' является зависит от столбца 'appId'. Сообщение 4922, уровень 16, состояние 9, строка 1 ALTER Сбой appId TABLE ALTER COLUMN, так как один или несколько объектов имеют доступ этот столбец.


Есть ли другой способ, кроме как удалить зависимости и воссоздать их?

Ответы [ 3 ]

75 голосов
/ 26 марта 2012

Я полагаю, что сначала вам придется отменить ограничения внешнего ключа.Затем обновите все соответствующие таблицы и переназначьте их, как они были.

ALTER TABLE [dbo.Details_tbl] DROP CONSTRAINT [FK_Details_tbl_User_tbl];
-- Perform more appropriate alters
ALTER TABLE [dbo.Details_tbl] ADD FOREIGN KEY (FK_Details_tbl_User_tbl) 
    REFERENCES User_tbl(appId);
-- Perform all appropriate alters to bring the key constraints back

Однако, если память не является действительно большой проблемой, я бы сохранил идентичность INT.Если вы не уверены на 100%, что ваши ключи никогда не выйдут за пределы ограничений TINYINT.Просто предостережение:)

37 голосов
/ 16 марта 2013

Если ваше ограничение относится к типу пользователя, то не забудьте посмотреть, есть ли Default Constraint, обычно что-то вроде DF__TableName__ColumnName__6BAEFA67, если так, то вам нужно будет сбросить Default Constraint, например так:

ALTER TABLE TableName DROP CONSTRAINT [DF__TableName__ColumnName__6BAEFA67]

Для получения дополнительной информации см. Комментарии блестящего Аарона Бертран на этот ответ .

0 голосов
/ 11 февраля 2019

Вы можете отбросить Ограничение, которое ограничивает вас. Если столбец имеет доступ к другой таблице. Предположим, что представление обращается к столбцу, который вы изменяете, тогда он не позволит вам изменить столбец, если вы не отбросите представление. и после внесения изменений вы можете воссоздать вид.

enter image description here

...