Перехід із рівня SQL Server 2008 до 2005 року


32

Файли баз даних, побудовані за допомогою SQL 2008, не можна порівняти з 2005 роком.


Не забудьте також експортувати вхід на сервер.
StanleyJohns

Це тому, що ви розвиваєтесь у 2008 році, але ваші виробничі сервери ще 2005 рік? Будь-яке рішення, яке ви пропонуєте, просто відкладе неминуче, в той же час зробить ваше життя жалюгідним, оскільки ви, ймовірно, будете робити ці пониження на регулярній основі.
datagod

Відповіді:


16

Не потрібно сторонніх інструментів. Студія управління SQL Server 2008 надала нам дуже потужний інструмент для конвертації бази даних, оскільки вони додали параметр "Дані сценарію" до майстра "База даних сценаріїв".

Просто клацніть правою кнопкою миші БД у SQL2008 SSMS та перейдіть до "Завдання", а потім "Створити сценарії"

Пройдіться майстром, переконайтеся, що вибрано "True" для "Script Data" під таблицею / параметри перегляду. Виберіть усі об'єкти, а потім запустіть створений ним сценарій на сервері 2005 року. (Будь ласка, майте на увазі, що створений сценарій може бути масовим, якщо оригінальна база даних дуже велика!)

Зауважте, що ви навіть можете запустити майстра на сервер SQL2005, щоб конвертувати базу даних SQL2005 в SQL2000 (вам, звичайно, знадобляться інструменти 2008, встановлені на вашій робочій станції).


4
Без образи, але це не може бути рішенням, якщо база даних велика. Спробуйте цю техніку на будь-якій таблиці з кількома мільйонами рядків (і думайте про varchar (max) як тип даних одного стовпця), і якщо Management Studio зможе відкрити та проаналізувати цей файл, ви будете раді, але я переконайтеся, що він не відкриється, він вийде з ладу. Вибачте, але це не є вирішенням цієї проблеми, за винятком випадків, коли db дійсно малий.
Мар’ян

3
Звичайно, якщо db занадто великий, скриптуйте лише структуру бази даних, тоді використовуйте свій улюблений метод (SSIS, BCP, майстер імпорту) для передачі даних.
BradC

У SSMS 11.0, мабуть, немає можливості скриптувати дані разом зі структурою. i.imgur.com/SGkG8oZ.png
jcollum

Ну гаразд, це зараз під "Типи даних до сценарію" трохи вище Параметри таблиці / перегляду
jcollum

16

Ви можете BCP дані з одного екземпляра SQL Server в інший екземпляр. Це був би найшвидший спосіб копіювання даних з однієї версії в іншу. Залежно від обсягу даних це може зайняти тривалий час.


2
Залежно від обсягу даних це майже завжди займе багато часу
jcolebrand

Так, це точно буде. Переміщення великої бази даних на більш стару версію SQL Server - завдання не з легких.
mrdenny

2
Перевага BCP полягає в тому, що це буде швидше, ніж використання даних сценарію. Так, це повільно, але це швидше, ніж багато альтернатив.
Єремія Пешка

15

На жаль, я не знаю прямого способу зменшити рівень БД з формату 2008 року до 2005 року.

Так, як я це робив у минулому (насправді зі старими версіями SQL-сервера, але процес буде таким же):

  1. Відновіть БД на екземплярі SQL2008, якщо цього ще не зроблено
  2. Створіть порожній БД з правильними структурами (таблиці, індекси, обмеження, представлення даних, програми, тригери, ...) на екземплярі SQL2005. Сподіваємось, ви можете це зробити з вашої існуючої процедури збирання та / або вихідного коду, але якщо ні, ви можете використовувати диспетчер SQL Server для створення сценаріїв для всього в БД 2005 року та запускати результат на порожньому в екземплярі 2008 року.
  3. Переконайтесь, що два екземпляри можуть бачити один одного (тобто немає брандмауерів, що блокують з'єднання, якщо екземпляри знаходяться на різних машинах) та зв’язувати їх за допомогою sp_addlinkedserver .
  4. Скопіюйте всі дані з однієї БД в іншу. Якщо в тригерах немає жодних обмежень для сторонніх ключів та подібних проблем, можна просто зв’язати БД разом із курсором через список таблиць (вибравши їх із sys.objects) та запустивши
    INSERT destinationserver.destinationdb.schema.table SELECT * FROM sourcedb.schema.table
    (або INSERT schema.table SELECT * FROM sourceserver.sourcedb.schema.tableякщо ви зв'язали екземпляри навпаки )
    для кожної таблиці. Якщо у вас є обмеження та тригери, що забезпечують узгодженість між таблицями, вам, звичайно, потрібно бути трохи розумнішими щодо впорядкування цих операцій, особливо якщо у вас є циклічні обмеження, як таблиця з обмеженням, заснованим на собі (одна ієрархія тримання дані, як можливий приклад).

Можливо, буде ефективніше просто скопіювати дані спочатку та додати всю іншу структуру (індекси, прокси, тригери, ...) після кроку 3. Це дозволяє уникнути проблем упорядкування рядків, що виникають через обмеження та тригери, та побудови індексів у Кінець теоретично повинен бути швидшим, ніж збирати їх, оскільки всі дані додаються - хоча якщо у вас є кластеризовані індекси на ваших таблицях, створіть їх перед додаванням даних, оскільки їх було б не швидше створити після факту.

Звичайно, все це передбачає, що жоден з ваших об'єктів не використовує специфічні функції SQL 2008 - якщо вони є, ви, сподіваємось, з’ясуєте та виправите такі речі, коли помилки під час відновлення схеми. Якщо будь-який ваш код покладається на офіційно не визначену поведінку, яка, можливо, варіюється між версіями SQL Server, у вас можуть з’явитися деякі набагато більш тонкі і невловимі помилки, щоб пізніше відшукати і випрасувати.


1
-1 тому, що це насправді неефективно (виберіть * в з) порівняно з подібними BCP.
jcolebrand

@jcolebrand досить справедливий щодо ефективності. Хоча техніка така, яку я мав працювати.
Девід Спіллетт

це справедлива система, я просто думав, що включу це на рахунок майбутніх читачів. Наразі ви отримали оновлення, щоб це не було проблемою. ;)
jcolebrand


1

Спершу потрібно скриптувати базу даних і переконатися, що у версії ви вказали тип, до якого потрібно знизити клас. І скопіювати дані з вищої версії в нижчу версію порівняння SQL Data зробить для вас хитрість.

Удачі!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.