Как изменить столбец без удаления таблицы в SQL 2008 - PullRequest
41 голосов
/ 20 января 2009

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

Ответы [ 5 ]

44 голосов
/ 07 сентября 2013

Не могу поверить, что главный ответ сидел здесь так долго - это очень опасный совет!

Есть несколько операций, которые вы можете выполнить на месте, не опуская свой стол:

Если вы оказались в ситуации, когда изменение столбца невозможно без удаления таблицы, вы обычно можете использовать запрос SELECT INTO, чтобы спроецировать ваши данные в новую таблицу, а затем удалить старую таблицу (временно отключив ограничения). и затем переименование проектируемой таблицы. В этом случае вам потребуется перевести базу данных в автономный режим для обслуживания.

37 голосов
/ 20 января 2009

В SQL Server 2008 перейдите в Инструменты >> Параметры. В маленьком окне нажмите «Дизайнер». Снимите флажок «Запретить сохранение изменений, требующих ...»

=====

Отредактировано 4 сентября 2015 г.

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

34 голосов
/ 25 ноября 2014

Вот что я использую:

-- 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
  1. Скопируйте данные в новый столбец.
  2. Оставьте старый столбец.
  3. Переименуйте новый столбец в имя старого столбца.
0 голосов
/ 21 июня 2017

Другим способом без полного опускания стола является

  1. Сделайте резервную копию значений столбца.
  2. Сделать столбец обнуляемым, если он уже не допускает нулевые значения. Установите значения столбца равными NULL, делает

    update tablename set columnname = null 
    
  3. Удалить столбец
  4. Вставьте новый столбец с тем же именем, что и удаленный столбец, и типом, который вы хотите
  5. Вставить сохраненные данные в этот столбец
0 голосов
/ 13 декабря 2013

У меня та же проблема. Хотя моя учетная запись имеет права sa, если я пытаюсь использовать другую учетную запись sa, это работает. Кажется, что-то мой аккаунт не имеет возможности изменить. все еще расследует, но это вопрос разрешения.

Обновление:

Я не могу объяснить это. но это то, что я сделал там две доменные группы принадлежали моей учетной записи. Одна была новой доменной группой AD, а другая - доменной группой NT NT. После того, как я удалил устаревшую группу доменов, я смог успешно изменить таблицу. Имейте в виду, что у обеих групп были привилегии "sa".

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

так что это была проблема с разрешением. Я не могу объяснить, как, но я надеюсь, что это поможет кому-то еще

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...