Переход с SQL Server 2008 на 2005

32

Файлы базы данных, созданные с использованием SQL 2008, несовместимы с 2005. Есть ли обходной путь?

Sevki
источник
Не забудьте также экспортировать логины сервера.
СтэнлиДжонс
Это потому, что вы разрабатываете в 2008 году, а ваши производственные серверы все еще 2005? Любое решение, которое вы предоставляете, просто откладывает неизбежное, и в то же время делает вашу жизнь несчастной, поскольку вы, вероятно, будете в конечном итоге делать эти понижения на регулярной основе.
датагод

Ответы:

16

Нет необходимости в сторонних инструментах. Среда управления SQL Server 2008 предоставила нам очень мощный инструмент для преобразования базы данных, поскольку они добавили параметр «Данные сценария» в мастер «База данных сценария».

Просто щелкните правой кнопкой мыши по базе данных в SQL2008 SSMS и перейдите к Задачам, затем «Создать сценарии»

Пройдя по мастеру, обязательно выберите «True» для «Script Data» в параметрах таблицы / представления. Выберите все объекты, затем запустите сценарий, который он создает на сервере 2005. (Имейте в виду, что созданный скрипт может быть огромным, если исходная база данных очень большая!)

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

BradC
источник
4
Без обид, но это не может быть решением, если база данных большая. Попробуйте эту технику для любой таблицы с несколькими миллионами строк (и представьте varchar (max) как тип данных одного столбца), и если Management Studio сможет открыть и проанализировать этот файл, вы будете счастливы, но я конечно, он не откроется, он рухнет. Извините, но это не решение этой проблемы, за исключением случаев, когда БД действительно мала.
Marian
3
Конечно, если база данных слишком большая, запишите только структуру базы данных, а затем используйте ваш любимый метод (SSIS, BCP, Import Wizard), чтобы отправить данные.
BradC
В SSMS 11.0, по-видимому, нет возможности записывать данные вместе со структурой. i.imgur.com/SGkG8oZ.png
jcollum
Ах, хорошо, теперь он находится в разделе «Типы данных для сценария» чуть выше параметров таблицы / представления
jcollum
16

Вы можете скопировать данные из одного экземпляра SQL Server в другой экземпляр. Это был бы самый быстрый способ скопировать данные из одной версии в другую. В зависимости от объема данных, это может занять много времени.

Иеремия Пешка
источник
2
В зависимости от объема данных это почти всегда займет много времени
jcolebrand
Да, это точно будет. Перемещение большой базы данных в более старую версию SQL Server - непростая задача.
Мрденный
2
Преимущество BCP в том, что это будет быстрее, чем использование данных сценария. Да, это медленно, но это быстрее, чем многие альтернативы.
Иеремия Пешка
15

К сожалению, я не знаю прямого пути понижения БД с формата 2008 до 2005 года.

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

  1. Восстановите БД в экземпляре SQL2008, если это еще не сделано
  2. Создайте пустую БД с правильными структурами (таблицами, индексами, ограничениями, представлениями, процессами, триггерами, ...) на экземпляре SQL2005. Надеемся, что вы можете сделать это из существующей процедуры сборки и / или исходного кода, но если нет, вы можете использовать SQL Server Manager для создания сценариев для всего в БД 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, потому что это на самом деле неэффективно (выберите * в from) по сравнению с подобными BCP.
Jcolebrand
@jcolebrand достаточно справедливо по эффективности. Хотя у меня есть техника, над которой я работал.
Дэвид Спиллетт
это справедливая система, я просто подумал, что включу это из-за будущих читателей здесь. У вас есть положительные отзывы в настоящее время, чтобы это не было проблемой. ;)
jcolebrand
1

Сначала вы должны составить сценарий для базы данных и убедиться, что в версии, которую вы указали, вы хотите уменьшить класс. А чтобы скопировать данные из более высокой версии в более низкую версию, сравнение данных SQL поможет вам.

Удачи!

Mbongeni
источник