ALTER TABLE в зависимой колонке
Я пытаюсь изменить тип данных столбца первичного ключа на tinyint из int.This этот столбец является внешним ключом в других таблицах. Поэтому я получаю следующую ошибку:
Msg 5074, уровень 16, состояние 1, строка 1 Объект 'PK_User_tbl' является зависит от столбца 'appId'. Msg 5074, уровень 16, состояние 1, строка 1 объект "FK_Details_tbl_User_tbl" зависит от столбца "appId". Msg 5074, уровень 16, состояние 1, строка 1 Объект 'FK_Log_tbl_User_tbl' является зависит от столбца 'appId'. Msg 4922, уровень 16, состояние 9, строка 1 ALTER TABLE ALTER COLUMN appId не удалось, поскольку доступ к одному или нескольким объектам этот столбец.
Есть ли другой способ, кроме удаления зависимостей и воссоздания?
Ответы
Ответ 1
Я считаю, что сначала вам придется отказаться от ограничений внешнего ключа. Затем обновите все соответствующие таблицы и перенаправьте их так, как они были.
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. Просто предостережение:)
Ответ 2
Если ваше ограничение относится к типу пользователя, то не забудьте посмотреть, есть ли Default Constraint
, обычно что-то вроде DF__TableName__ColumnName__6BAEFA67
, если это так, вам нужно будет сбросить Default Constraint
, например:
ALTER TABLE TableName DROP CONSTRAINT [DF__TableName__ColumnName__6BAEFA67]
Для получения дополнительной информации см. комментарии блестящего Аарона Бертрана на этом ответе.