Автоматическая миграция файловых групп в SQL Server
Недавно я пытался реструктурировать старую базу данных, которая не была разработана с файловыми группами (просто по умолчанию PRIMARY
) и, кроме всего прочего, перенести несколько таблиц на новый Data
Файловая группа, находящаяся в сети SAN. Я знаю, как перенести данные:
ALTER TABLE MyTable
DROP CONSTRAINT PK_MyTable WITH (MOVE TO [MyDB_Data])
ALTER TABLE MyTable
ADD CONSTRAINT PK_MyTable
PRIMARY KEY CLUSTERED (MyID)
ON [MyDB_Data]
Но, черт возьми, если это не самая утомительная работа, которую мне приходилось делать. И это подвержено ошибкам. В какой-то момент я был на полпути (я полагаю, поскольку нет индикатора прогресса), переместив таблицу размером 30 ГБ, прежде чем я понял, что случайно включил один из столбцов значений в PK. Поэтому мне пришлось начинать все сначала.
Еще хуже, когда в таблице много зависимостей. Тогда я не могу просто отбросить первичный ключ; Я должен удалить и воссоздать каждый внешний ключ, который ссылается на него. Это приводит к сотням линий шаблона; умножьте на 100 таблиц, и он станет совершенно чистым. Мои запястья болят.
Кто-нибудь придумал ярлык для этого? Есть ли какие-нибудь инструменты (оцениваемые с учетом одноразового использования), которые могут это сделать? Возможно, кто-то здесь должен был пройти через этот процесс раньше и написал свой собственный инструмент / сценарий, которым он не против поделиться?
Очевидно, что SSMS этого не сделает - она может генерировать сценарии миграции только для некластеризованных индексов (и они должны быть индексами, а не UNIQUE
ограничения - по крайней мере, для нескольких таблиц, к лучшему или к худшему, кластерный индекс на самом деле не является первичным ключом, это другой UNIQUE
ограничение).
Дело не в том, что синтаксис настолько сложен, что я не могу написать для него код gen. По крайней мере, для основной части перетаскивания и воссоздания первичного ключа. Но добавьте в накладные расходы выяснение всех зависимостей и генерацию сценариев удаления / воссоздания для всех внешних ключей, и это начинает казаться, что он как раз превышает тот порог, когда нужно больше автоматизировать и полностью протестировать, чем просто выполнять каждую таблицу вручную, как в примере выше.
Итак, вопрос: может ли этот процесс быть автоматизирован любым достаточно простым способом? Есть ли альтернативы тому, что я написал выше?
Спасибо!
1 ответ
Самый простой способ сделать это, IMO, - использовать один из инструментов сравнения схем ( Мой инструмент, SQL Compare из Red Gate, Apex SQL Diff в качестве нескольких примеров) для создания сценария вашей схемы. Затем отредактируйте этот скрипт, чтобы создать все пустые объекты в нужных группах файлов. Сделав это, вы можете использовать те же инструменты для сравнения вашей новой БД с правильными файловыми группами, и они сгенерируют сценарии для переноса данных за вас. Стоит протестировать с несколькими, чтобы найти наиболее подходящий для вас.