четверг, 21 января 2010 г.

MSSQL | Подлость. Никогда не доверяйте!

Был обычный день. Настал момент в базе данных у одной таблицы сменить тип с 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).

Всё. Живем.

Комментариев нет: