Почему SQL 2008 внезапно хочет отбросить мои таблицы, когда я собираюсь изменить тип столбца с, скажем, int на real? Насколько мне известно, этого никогда не происходило в SQL 2005. Любая информация будет полезна, пожалуйста.
У меня была эта проблема с MSSM, но я мог изменить свою таблицу с помощью программного обеспечения DB Forge.





В SQL Server 2008 перейдите в Инструменты >> Параметры. В маленьком окошке нажмите «Дизайнер». Снимите флажок «Запретить сохранение изменений, требующих ...»
=====
Отредактировано 4 сентября 2015 г.
Я добавил сюда этот ответ давным-давно, описывая способ решения ситуации, описанной в вопросе выше. С тех пор пользователи в приведенных ниже потоках выразили несколько опасений по поводу того, что делать то, что я рекомендовал в то время. По сути, описанное мной решение могло быть проблематичным в некоторых сценариях. Затем я предлагаю вам продолжить чтение, чтобы проверить комментарии других пользователей и выбрать лучшее решение для вас.
Но он бросает стол! Не подходит для очень больших таблиц.
Это не ответ на вопрос, а настройка, позволяющая незаметно опускать таблицу структурных изменений, что, по ИМХО, очень плохо!
Процент людей, желающих перейти с безобидного nvarchar (200) на nvarchar (4000), будет неизвестен - мне пришлось сделать именно это, и, таким образом, этот ответ был "прекрасным" и быстрым. Однако я согласен с другими в том, что это опасно во многих других преобразованиях типов данных и т. д.
Не могу поверить, что главный ответ так долго сидел здесь - это очень опасный совет!
Есть несколько операций, которые вы можете выполнить на месте, не уронив стол:
Если вы оказались в ситуации, когда изменение столбца невозможно без отбрасывания таблицы, обычно вы можете использовать запрос SELECT INTO для проецирования данных в новую таблицу, затем отбросить старую таблицу (временно отключив ограничения), а затем переименовать спроецированные данные. Таблица. Однако в этом случае вам нужно будет отключить базу данных для обслуживания.
У меня такая же проблема. Хотя моя учетная запись имеет права sa, если я попытаюсь использовать другую учетную запись sa, она работает. Кажется, что почему-то моя учетная запись не может быть изменена. все еще ведется расследование, но это проблема с разрешением.
Обновить:
Я не могу это объяснить. но это то, что я сделал. там две группы доменов, к которым принадлежала моя учетная запись. Одна была новой группой домена AD, а другая - устаревшей группой домена NT. Как только я удалил устаревшую группу домена, я смог успешно изменить таблицу. Имейте в виду, что у вас обеих групп были привилегии "са".
Поведение заключалось в том, что команды alter приводили к успеху, но в таблице ничего не менялось. Затем, когда я вручную попытался изменить поля через конструктор, он пожаловался, что мне не разрешено вносить изменения, если требуется удалить и воссоздать таблицу. Я нашел настройку в инструментах и смог ее отключить. Но этот стол огромен, и делать это - не лучший вариант. Я бы посоветовал другим не делать этого.
так что это была проблема с разрешением. Я не могу объяснить, как, но надеюсь, что это поможет кому-то другому
Вот что я использую:
-- Add new column
ALTER TABLE MyTable
ADD Description2 VARCHAR(MAX)
GO
-- Copy data to new column (probably with modifications)
Update MyTable
SET Description2 = Description
GO
-- Drop old column
ALTER TABLE MyTable
DROP COLUMN Description
GO
-- Rename new column to the original column's name.
sp_RENAME 'MyTable.Description2' , 'Description', 'COLUMN'
GO
Как эта стратегия влияет на индекс, если столбец проиндексирован?
Насколько мне известно, вам придется заново создать индексы для этого столбца. Вышеупомянутое действие должно удалить их все (или, чтобы лучше перефразировать: оно должно удалить столбец из всех связанных индексов).
Второй оператор в разделе «Копировать данные в новый столбец» не будет работать, потому что «Описание2» будет недопустимым объектом / столбцом.
Кроме того, этот ответ работает, только если таблица пуста. Если таблица не пуста, я получаю следующую ошибку: «ALTER TABLE позволяет добавлять только столбцы, которые могут содержать нули, или иметь определение DEFAULT, или добавляемый столбец является столбцом идентификатора или метки времени, или, альтернативно, если ни один из предыдущие условия выполнены, таблица должна быть пустой, чтобы можно было добавить этот столбец. Столбец «Описание2» не может быть добавлен в непустую таблицу «MyTable», потому что он не удовлетворяет этим условиям ».
@usefulBee Полученная ошибка дает вам решение: используйте значение по умолчанию из столбца при его создании.
Блестящий ответ, именно то, что мне нужно! Искал 2 дня, пытаясь найти решение, и это сработало отлично - вы положили конец моей панике, спасибо
Сторона переключения - отличное решение ^ _ ^
Другой способ сделать это без полного отказа от стола -
Сделайте столбец допускающим значение NULL, если он еще не допускает значений NULL. Установите для значений столбца значение NULL с помощью делает
update tablename set columnname = null
Этот ответ на SF отвечает правильно [stackoverflow.com/a/11035353/1711106 impression[1] [1]: stackoverflow.com/a/11035353/1711106