Как изменить столбец без отбрасывания таблицы в SQL 2008

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

Этот ответ на SF отвечает правильно [stackoverflow.com/a/11035353/1711106 impression[1] [1]: stackoverflow.com/a/11035353/1711106

Vishwajit G 12.12.2013 13:12

У меня была эта проблема с MSSM, но я мог изменить свою таблицу с помощью программного обеспечения DB Forge.

Mostafa Fallah 06.01.2020 12:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
46
2
90 185
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

=====

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

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

Но он бросает стол! Не подходит для очень больших таблиц.

Mahmoud Moravej 21.08.2013 15:19

Это не ответ на вопрос, а настройка, позволяющая незаметно опускать таблицу структурных изменений, что, по ИМХО, очень плохо!

Jan 02.09.2013 18:15

Процент людей, желающих перейти с безобидного nvarchar (200) на nvarchar (4000), будет неизвестен - мне пришлось сделать именно это, и, таким образом, этот ответ был "прекрасным" и быстрым. Однако я согласен с другими в том, что это опасно во многих других преобразованиях типов данных и т. д.

Tom Stickel 03.09.2015 20:05

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

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

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

Как эта стратегия влияет на индекс, если столбец проиндексирован?

Dave 12.10.2015 21:55

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

user2173353 13.10.2015 10:32

Второй оператор в разделе «Копировать данные в новый столбец» не будет работать, потому что «Описание2» будет недопустимым объектом / столбцом.

usefulBee 03.03.2016 19:55

Кроме того, этот ответ работает, только если таблица пуста. Если таблица не пуста, я получаю следующую ошибку: «ALTER TABLE позволяет добавлять только столбцы, которые могут содержать нули, или иметь определение DEFAULT, или добавляемый столбец является столбцом идентификатора или метки времени, или, альтернативно, если ни один из предыдущие условия выполнены, таблица должна быть пустой, чтобы можно было добавить этот столбец. Столбец «Описание2» не может быть добавлен в непустую таблицу «MyTable», потому что он не удовлетворяет этим условиям ».

usefulBee 03.03.2016 22:45

@usefulBee Полученная ошибка дает вам решение: используйте значение по умолчанию из столбца при его создании.

user2173353 04.03.2016 11:20

Блестящий ответ, именно то, что мне нужно! Искал 2 дня, пытаясь найти решение, и это сработало отлично - вы положили конец моей панике, спасибо

David 27.07.2016 12:51

Сторона переключения - отличное решение ^ _ ^

Alper 09.05.2019 16:53

Другой способ сделать это без полного отказа от стола -

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

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

Другие вопросы по теме