откат представления к предыдущей версии того же представления

#sql-server #deployment #fluent-migrator

#sql-server #развертывание #fluent-migrator

Вопрос:

Я использую FM для развертывания базы данных. В рамках этого развертывания я разворачиваю представление. Изменения выглядят следующим образом:

R1: создать представление

R2: никаких изменений в представлении

R3: добавить столбец в представление

R4: изменений нет

R5: удалите столбец из представления

Представление создается скриптом, который находится в системе управления версиями. Допустим, я развертываю R3, а затем решаю, что мне следует выполнить откат к R2 (я имею в виду производственный сайт, который я не хочу оставлять в нечетном состоянии). Итак, сценарий представления (удаление / создание) находится в локальном файле. Я не могу снова использовать этот скрипт, потому что локальная версия находится на R3, но я хочу, чтобы он вернулся к R1 (или R2).

Как я могу надежно откатить представление к предыдущей версии с помощью FluentMigrator? Единственный вариант, который я могу придумать, это сохранить сценарий создания представления в виде строки в моем классе миграции. Но, похоже, мне нужно было бы иметь каждую его версию в виде строки в моем классе — очень громоздко и сложно продать команде.

Каждое реалистичное решение этого, которое я могу придумать, в некотором роде противоречит идее управления версиями — иметь единственную версию вещи локально и отслеживать ее изменения с течением времени.

Ответ №1:

Я добавил эту функцию во FluentMigrator — возможность выполнять скрипт прямо из исходного кода. Вы можете получить это здесь:

https://github.com/jcollum/fluentmigrator

В настоящее время поддерживается только SVN. Еще не интегрирован в основную ветку.

Ответ №2:

Один очень простой способ — сделать что-то вроде:

 if (object_id('dbo.myView', 'V')) is not null
   drop view [dbo].[myView]
go
create view [dbo].[myView] as

select foo, bar
from dbo.Orders
  

Теперь, если вам нужно изменить это представление, вы вносите свои изменения в этот скрипт и развертываете их. Это удалит представление, если оно существует, и создаст его заново. С точки зрения управления версиями все, что вы делаете, это вносите изменения в текстовый файл, чтобы вы могли эффективно его сохранять, довольно просто просматривать различия и т.д. Другими словами, вы можете делать все то, что действительно хорошо делает система управления версиями, потому что это просто текст.

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

1. Нет, это не сработает. Подумайте о том, что происходит с управлением версиями файлов и управлением версиями.

2. Странно, что вы говорите, что это не сработает. Я предложил это, потому что я использовал это, и это работает для меня. Удачи в поиске того, что вы ищете.

3. Хорошо, я объясню: у вас есть представление в скрипте, который является удалением / созданием для R5 представления. Вы запускаете этот скрипт. Теперь вы хотите выполнить откат к предыдущей версии того же представления (например, R3). Ну, сценарий, который у вас есть локально, — это R5. Итак, как вы используете версию скрипта, который у вас есть локально, чтобы получить доступ к R3 этого представления? Вы не можете. Вам пришлось бы удалить его из системы управления версиями.

4. Для этого и существует управление версиями; возврат в прошлое для конкретного объекта и просмотр истории изменений. Но давайте представим, что у вас нет системы управления версиями. Я также выполнил то, что вы хотите сделать, переименовывая существующее представление и создавая представление заново каждый раз. Итак, у вас может быть несколько версий одного и того же представления, только к одной из которых доступен ваш код. Если / когда вам нужно выполнить откат, вы удаляете «текущую» версию и переименовываете соответствующую версию в текущее имя.

5. Да, я это понимаю. Но удалось ли вам заставить это работать в FluentMigrator?