8 нояб. 2007 г.

С MS SQL Server 2005 на MS SQL Server 2000

Я тут было начала пост писать о том, что народ не очень любит переходить на новый софт, что MS SQL Server 2005 удобнее, чем 2000ый, что я такая умная, а миня не понимают, как наступила на уютно разложенные грабли от Microsoft. И по голове так треснуло, что на 3 часа загнало в Google. И это я еще хорошо отделалась.

А дело вот в чем: многие или некоторые знают, что у продуктов MS туго с совместимостью. Как с прямой, так и с обратной.
Если с прямой совместимостью дела еще более-менее, т.е. мы открываем наше творчество от визуальной студии 2000 в ее младшей сестре 2005ой, а та говорит "Ой-ой-ой, сейчас все сделаем. Хотите?", жмем OK/Yes да-да-да, получаем креатив от 2005 студии и наслаждаемся новой средой. То с обратной совместимостью проблемы еще те.
Вот сегодня наступила на проблему того, что базу данных из MS SQL 2005 не открыть в MS SQL 2000: лично мне выдало ошибку 602, но, если верить форумам, то там их (ошибок) целый букет.
Никак не соглашался 2000ый сиквел принять базу из 2005го: ни отсоединить-присоединить, ни импорт-экспорт. Даже при том, что в базе на 2005ой четко стоит уровень совместимости c SQL Server 2000 (Database -> Properties -> Options -> Compatibility Level).

Способ нашелся.

Исходная позиция: нужная база соединена с "родным" MS Sql 2005, открыта панель управления базой (MS Sql Server Management Studio).
1) Копируем структуру:

Вызываем у базы контекстное меню, выбираем Tasks -> Generate Scripts...

Нужная база в списке выбрана, ставим галочку Script all objects in the selected database, жмем Next (Далее).

Выставляем у элементов следующие значения:
Script Collation - TRUE
Script Database Create - TRUE
Script for Server Version - SQL SERVER 2000
Script foreign keys - FALSE
Script Triggers - FALSE

Выбираем куда скрипты вывести, жмем Next, жмем Finish.

В целевой MS SQL Server 2000 создаем новую базу с нужным именем в нужном месте.
Можно это делать и скриптами, но так, по-моему, проще, к тому же можно изменить место возлежания базы, что в моем случае происходило.
Открываем в 2000ой Tools -> SQL Query Analyser, копируем в окно нового запроса текст созданных в 2005ой скриптов, убираем часть, создающую базу (оставляем все, что создает таблицы, не забываем проверить имя целевой базы, если менялось, т.е. USE [имя базы]). Проверяем скрипты (Parse query), запускаем на исполнение, получаем таблицы.

2) Копируем данные:

Пишут, что у некоторых в контекстном меню базы есть пункт Export Data. Чтож, рада за них, а у меня нет.
Поэтому качаем Microsoft SQL Server Database Publishing Wizard, распаковываем куда-нибудь.
Идем куда распаковали (или "вытягиваем" его в Tools 2005го), запускаем - открылся визард, похожий на предыдущий, которым структуру копировали. Опции следующие, а остальное то же самое.



Получили скрипты с данными. Опять кидаем их в Query Analyser 2000го, запускаем, заполняются таблички.

3) Копируем связи и триггеры (foreign keys и Triggers)
:

Этот способ сработал у меня по полной программе:

Опять обращаемся к скачанному Publishing Wizard в MS SQL Server 2005.

Идем по визарду:
сервер localhost,
при выборе базы данных выбираем из списка нужную и снимаем галочку Script all objects in the selected database,
далее в списке элементов базы отмечаем только Таблицы (Tables), жмем Next,
выбираем все таблицы, Next,
выбираем куда сохранить, Next,
выставляем опции Script for target database как MS SQL 2000 и Types of data to publish как Schema only, Next, Finish.

Из полученного файла скрипты копируем в Query Analyser 2000го, наслаждаемся.


Скрипты этого способа вызывали ошибки в анализаторе запроса 2000го сервера:


Вызываем у базы в 2005м контекстное меню, выбираем Tasks -> Generate Scripts...

Нужная база в списке выбрана, снимаем галочку Script all objects in the selected database, жмем Next (Далее).

Выставляем у элементов следующие значения:
Include IF NOT EXISTS - TRUE
Script Owner - TRUE
Script for Server Version - 2000
Script foreign keys - TRUE
Script Triggers - TRUE
Жмем Next.

Появится список элементов базы данным. Ставим галочку только около таблиц (Tables). Жмем Next.
Далее выбираем все таблицы, жмем Next.
Выбираем куда вывести скрипты, Next, Next, Finish.

Запускаем скрипты на 2000м сервере, проверяем.

Способ не претендует на то, что он лучший. Думаю, я еще несколько способов изобрету. Но работает :)

14 комментариев:

Анонимный комментирует...

Да, Майкрософт не всегда дружен сам с собой.

Если задача одноразовая, я бы использовал триальную версию одной из программ для создания/сравнения структуры и данных типа SQL Data Compare или myLittleAdmin.

Natallia комментирует...

Что-то мне подсказывает, что может оказаться многоразовой.
Я обязательно попробую предложенный софт. :)

Анонимный комментирует...
Этот комментарий был удален администратором блога.
Анонимный комментирует...

поднимаю рейтинг блока = сиськи

Natallia комментирует...

:)) черный пиар

Анонимный комментирует...

К тому же не меньше 3-его размера :)

Natallia комментирует...

какое дико полезное обсуждение :)))

Анонимный комментирует...

Столкнулся с похожей поблемой, переношу узел SharePoint с одной фермы на другую, точно также с 2005 сиквела на 2000-й. Все сработало, только одна проблема - выводной файл на втором этапе получился 450мб. Все дико тормозит и виснет при импорте в Query Analyser, а вылетает с сообщением о недопустимй длине строк в 64кб. Вы не могли бы подсказать, как это проблему можно обойти?

Natallia комментирует...

Антон, а ты пробовал сохранить данные в файл и открыть 2000ой запрос из файла?

Анонимный комментирует...

Ну, спасибо тебе Наташа! Выручила!

Natallia комментирует...

пожалуйста

Unknown комментирует...

у меня в пункте 2 размер .sql файла 24гб получился, только профукал картинку и там было тип дата и чема.и как вы сказали Антону сохранить в файл.вопрос: в какой формат файла сохранять данные?

Natallia комментирует...

Александр, в .sql
не маленькая у вас базка и для такого обходного маневра действительно тяжеловата... попробуйте по частям переносить: связанные таблицы, потом не связанные. Подозреваю, что у вас там могут файлы лежать - попробуйте их переносить отдельно.

Unknown комментирует...

база 1С-ная.буду пробовать вариант: создать в SQL 2000 базу.а в 1С-ке базу выгрузить в zip и создать новую sql, загрузить из zip, указав имя базы,которая в 2000 sql.