#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?