ALTER TABLE для зависимого столбца

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


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


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


person Milee    schedule 26.03.2012    source источник


Ответы (3)


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

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. Просто предупреждение :)

person Justin Pihony    schedule 26.03.2012
comment
В SSMS вам будет удобно щелкнуть правой кнопкой мыши по индексу и выбрать Создать скрипт для индекса ›Сгенерировать код для оператора INSERT в› ... - person Marco Marsala; 09.02.2016
comment
Ты жжешь! Я бы не спал сегодня без тебя - person dijam; 05.09.2016
comment
Щелчок правой кнопкой мыши по таблице ›› Дизайн и последующее обновление шрифта у меня сработали. - person meekash55; 25.01.2021

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

ALTER TABLE TableName DROP CONSTRAINT [DF__TableName__ColumnName__6BAEFA67]

Дополнительные сведения см. В комментариях блестящего Аарона Бертрана к этому ответу.

person Serj Sagan    schedule 16.03.2013
comment
Просто чтобы уточнить - команда DROP CONSTRAINT должна выполняться как запрос к таблице в Visual Studio в контексте данных (а не в SQL MS на фактической базе данных SQL). (Мне пришлось выяснить это на собственном горьком опыте, будучи новичком в этом деле, поэтому я подумал, что другие люди могут найти это разъяснение полезным). - person Andy; 15.06.2015
comment
@Andarta: большое спасибо за предупреждение, но что такое «контекст данных» в студии управления сервером sql? У меня есть ситуация, когда ограничение не позволяет мне изменять столбец, но я не могу отказаться от ограничения, потому что SQLSERVER сообщает мне, что его не существует! - person realtebo; 18.07.2018
comment
@realtebo - «контекст данных» относится к контексту подключения к данным, который вы видите в проводнике сервера в Visual Studio. Поэтому вместо того, чтобы пытаться снять ограничение в SSMS, попробуйте сделать это в Visual Studio. - person Andy; 19.07.2018

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

введите описание изображения здесь

person Santosh    schedule 11.02.2019