Был обычный день. Настал момент в базе данных у одной таблицы сменить тип с
text на
ntext. А таблица на
500к строк. И важная - жуть! Ок, Sql managment studio создала скрипт. Интересно, но скрипт создавал временную таблицу, копировал в неё оригинальную, потом дропал оригинальную и переименовывал временную в название оригинала. Вроде - все нормально, все обернуто транзакциями.
Да вот только обернуто то не все вместе, а каждая команда по отдельности! Ну в результате - сначала мешали внешние ключи. А потом просто - оригинальная таблица дропнулась и временной не видно!? ВСЁ!
П
рощайте данные!
Да, есть бекап. Ночной. Общий на
50Гиг. Шутки в сторону. Микрософт не научил студию восстанавливать таблицы по одной. Финиш. А точнее - пипец!
Но я умный. У меня есть машина-дублер. Правда она - на постгресе!
В общем поимел я секса с
sqlcmd и конвертированием ~300Мегового бекапа в стиле INSERT INTO TABLE. Хорошо что была линукс-машина и хвала vim! Особенно его комманде глобальной замены
%s/что_искать/на_что_менять/gn.
Для интереса - sqlcmd работает по стандарту. Т.е. каждая команда должна завершаться
пинком командой GO. Но кроме того из-за огромного размера - каждый инсерт пришлось обернуть в транзакцию.
Типа:
begin tran;
insert into ...;
commit tran;
go
Ну и конечно же вызов sqlcmd с флагом кодировки -f 65001 (это utf-8).
Всё. Живем.