SQL: Изменение последовательности столбцов

maximovega

Можно безболезненно изменить последователность столбцов в такой ситуации?
К табличке придаётся дополнительный столбец, притом хотелось бы его вставить перед последним столбцом (таблица содержит результаты вычислений и даты проведения вычислений записываются в последний столбец: изменение последовательности смотрится по меньшей мере неэстетично (и нелогично также.
После
ALTER TABLE [FinTools].[dbo].[TEST]
ADD [ID] Int
пытаюсь применить опцию Design (по нажатии правой клавиши мыши но сохранить изменения SQL не даёт, пишет "... must be re-created ..."
Eщё ситуация осложняется последующим использованием архивной таблицы:
INSERT INTO [FinTools].[dbo].[ARCHIVE_TEST] SELECT * FROM [TEST]
Нужно будет добавить столбец там? Если да, то тоже с той же последовательностью? И всё ли это, что потребуется изменить в отношении архивной таблицы после изменений во временной?

zorin29

Порядок следования полей в SQL-таблице тебя не должен волновать. Ты всегда можешь изменить порядок полей в SELECT-запросе, которым делаешь выборку.
Запрос SELECT * плох, в частности, тем, что ты не управляешь порядком полей.
Предлагаемое решение 1: добавь колонку в конец, замени все звездочки в запросах на списки интересующих тебя полей. При этом в запрос заполнения таблицы ARCHIVE_TEST можно как включать новое поле ID, так и не включать.
Предлагаемое решение 2: вставить поле предпоследним (создать другую таблицу с правильным порядком полей, перекинуть в нее данные, удалить старую, переименовать новую). Это автоматически умеет делать, скажем, SQL Management Studio. Но если много данных, то не рекомендую их так гонять.
А потом проделать ту же операцию и с архивной таблицей.

state7401281

> замени все звездочки в запросах на списки интересующих тебя полей
тиран! деспот!

doublemother

Хм, в мускулях есть инструкции вида:
ALTER TABLE mytable MODIFY COLUMN colname int(11) DEFAULT 42 AFTER anothercolname;
ALTER TABLE mytable MODIFY COLUMN colname2 varchar(256) NOT NULL FIRST;
ALTER TABLE mytable CHANGE COLUMN colname colname int(11) DEFAULT 42 AFTER anothercolname;
ALTER TABLE mytable CHANGE COLUMN colname2 colname2 varchar(256) NOT NULL FIRST;

В MSSQL точно ничего такого нет?

Dasar

В MSSQL точно ничего такого нет?
ТС это и делает. но управляющая консоль предупреждает, что добавление колонки влечет за собой изменение ширины строки таблицы, и что применение такого изменения будет делаться через скрытое создание новой таблицы и копирования в нее имеющихся данных, если таблица большая, то это может занять долгое время, при этом на большее время изменения будет заблокирован доступ на таблицу, что приведет к отказу в обслуживании на это время, что чревато - если это production-база.

Dasar

пытаюсь применить опцию Design (по нажатии правой клавиши мыши но сохранить изменения SQL не даёт, пишет "... must be re-created ..."
зайди в настройки и сними галку
с Tools -> Options -> Designers -> Prevent saving changes that require table re-creation

maximovega

Здорово! Работает, спасибо огромное!
P.S. Раз это так просто, это случайно ничем не чревато?

Dasar

P.S. Раз это так просто, это случайно ничем не чревато?
если таблица большая: сотни МБ и больше, то это может занять достаточно длительное время

cer2008

чревато - если это production-база
Если у Флосси есть доступ к production, то это само по себе чревато...
Оставить комментарий
Имя или ник:
Комментарий: