Как развернуть сценарии SQL через Azure CI/CD?

У нас есть набор сценариев SQL (файлы .sql), которые мы вручную развертываем с одного сервера на другой сервер.

Все сценарии SQL управляются через SQL Project в Azure.

Как развернуть сценарии SQL через Azure CI/CD?

Можете ли вы предоставить некоторую информацию о том, какие исследования вы провели, что вы пробовали и что не сработало с подходами, которые вы пробовали?

Daniel Mann 10.04.2019 20:37

@DanielMann, у меня есть пакетный файл для традиционного развертывания сценария sql. Я прочитал статью из простого разговора о SQL CI/CD. Мне было интересно, как реализовать?

goofyui 10.04.2019 20:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
1 951
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Управлению схемами баз данных и тому, как они продвигаются в ваших средах, следует уделять такое же внимание развертыванию приложений и инфраструктуры. Вот некоторые рекомендации высокого уровня.

  1. Управления источником — вам нужно будет поместить свои скрипты в систему управления версиями. Если вы используете Azure DevOps, используйте репозиторий Git для хранения всех созданных сценариев. Более того, они нужны нам в системе контроля версий, чтобы наш инструментарий CI/CD мог это сделать. Если вы администратор баз данных и это звучит для вас странно, извините, вам придется к этому привыкнуть.

    1б. Включить запросы на вытягивание — Настройте исходный репозиторий так, чтобы он принимал изменения только из запроса на включение. Это гарантирует, что ваши изменения схемы проверяются до того, как они будут приняты в репозиторий. Улучшает обмен знаниями в команде и повышает общее качество, поскольку может обнаруживать ошибки до их развертывания.

  2. Безопасность — заблокируйте вашу базу данных, чтобы случайные пользователи не могли вносить случайные изменения. Создайте специальную учетную запись для применения изменений схемы базы данных и предоставьте учетные данные только инструменту непрерывной доставки. В этой модели, если он не находится в системе контроля версий, он не существует. Наш инструмент CI/CD будет отвечать за развертывание этих изменений для нас.

  3. Используйте инструмент - и хватит делать это вручную! Наша команда выбрала платформу с открытым исходным кодом под названием БД-мигрировать, которая управляет изменениями в схемах базы данных. Мы выбрали db-migrate, поскольку он имеет открытый исходный код и работает на разных платформах. Microsoft использует EntityFramework Code-First миграции, на котором основана db-migrate.

    Как работает миграция: по сути, каждый раз, когда вам нужно изменить базу данных, вы создаете «миграцию», которая включает изменения вашего SQL-скрипта. Когда инструмент работает с вашей базой данных, он создает таблицу в базе данных, чтобы отслеживать, какие миграции были запущены ранее, поэтому он запускает только новые миграции. Короче говоря, миграции должны быть неразрушающими, чтобы предотвратить потерю данных, а сценарии следует считать доступными только для чтения после их применения к любой базе данных. (Вы никогда не должны изменять скрипт миграции sql после того, как он был использован; вместо этого создайте новую миграцию)

  4. Непрерывная интеграция — каждый раз, когда новая миграция регистрируется в системе управления версиями, ваш CI-сервер упаковывает сценарии как артефакт для следующего этапа.

  5. Непрерывная доставка — система непрерывной доставки берет артефакт сборки и запускает инструмент db-migrate (node.js) для каждой целевой среды. Инструмент CD использует выделенную учетную запись пользователя SQL, которой разрешено вносить изменения в схему базы данных. Как показано в № 2, это должен быть единственный способ развертывания изменений.

ОБНОВЛЕНИЕ: Использование Entity Framework

Как видно из описанного выше подхода, я, очевидно, очень заинтересован в том, чтобы изменения схемы базы данных ограничивались определенной учетной записью пользователя, чтобы предотвратить случайное развертывание приложения с учетной записью пользователя, имеющей неограниченный доступ. Ваш пробег может варьироваться, но есть несколько подходов, которые вы можете использовать:

  1. Используйте миграция.exe для выполнения миграции — этот инструмент поставляется с EntityFramework, и в качестве шага развертывания можно будет вызвать миграцию кода в первую очередь. Это было бы очень похоже на то, как я использую db-migrate выше.

  2. Скрипт миграции во время запуска приложения — вы можете написать код в логике инициализации вашего веб-приложения в выполнить любые незавершенные миграции. Это, пожалуй, проще всего реализовать, но для этого требуется, чтобы вы запускали приложение с учетной записью базы данных, имеющей неограниченный доступ. Кроме того, если возникнет проблема с миграцией базы данных, вы не узнаете об этом до тех пор, пока приложение не будет развернуто. С точки зрения CI/CD, я хотел бы отказаться от развертывания и, возможно, отката, прежде чем полностью испортить сайт.

  3. Настройка профиля публикации — вы можете настроить профиль публикации как изложено в этой статье для «Обновить базу данных». Это эффективно добавляет databaseInitializer в файл web.config для обновления базы данных при запуске приложения. Это имеет аналогичные недостатки, но, по крайней мере, позволяет вам иметь другую учетную запись пользователя для применения изменений базы данных.

Обратите внимание, что вполне возможно встроить ваши хранимые процедуры в качестве ресурсов в ваши миграции, а затем просто вызвать необработанные операторы sql из миграции:

Базовая миграция:

/// <summary>
/// Custom DbMigration with helper methods
/// </summary>
public abstract class BaseDbMigration : DbMigration
{
    /// <summary>
    /// Apply a SQL statement stored in an embedded resource
    /// </summary>
    /// <param name = "resourceName"></param>
    protected void SqlFromEmbeddedResource(string resourceName)
    {
        Assembly assembly = typeof(BaseDbMigration).Assembly;

        string baseNamespace = typeof(BaseDbMigration).Namespace;

        resourceName = baseNamespace + "." + resourceName;

        bool exists = assembly.GetManifestResourceNames().Where(r => r == resourceName).SingleOrDefault() != null;

        if (exists)
        {
            string sql = null;

            using (var stream = assembly.GetManifestResourceStream(resourceName))
            {
                var reader = new StreamReader(stream);
                sql = reader.ReadToEnd();
            }

            base.Sql(sql);
        }
    }
}

Пример миграции:

/// <summary>
/// Migration: Deploy Stored Proc
/// </summary>
public partial class CalculateTotalsV1 : BaseDbMigration
{
    /// <summary>
    /// </summary>
    public override void Up()
    {
        base.SqlFromEmbeddedResource("sp_CalculateTotals.v1.Up.sql");
    }

    /// <summary>
    /// </summary>
    public override void Down()
    {
        base.SqlFromEmbeddedResource("sp_CalculateTotals.v1.Down.sql");
    }
}

Кроме того, если вы хотите, чтобы миграция базы данных была отделена от развертывания приложения, само собой разумеется, что вы захотите разделить свои миграции с кодом на их собственную сборку .net. Это упрощает вызов миграции.

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

goofyui 10.04.2019 22:21

спасибо .. Насколько я понимаю, инструмент db-migrate не для MS SQL. А также наш текущий проект посвящен модели Entity Framework — Code First Migration. EF помогает генерировать схему таблицы. Я работаю над кучей SQL-процедур и постоянными изменениями в SQL SP.

goofyui 11.04.2019 05:52

Обновлено примечание, чтобы включить сведения о развертывании миграции Code-First EntityFramework таким же образом, как db-migrate.

bryanbcook 11.04.2019 22:11

большое спасибо .. но я упоминал в своих предыдущих заметках .. что я работаю над отправкой хранимых процедур .. .sql файлов .. . Entity Framework хорош из приложения .Net. Здесь речь идет о том, чтобы сделать SQL отдельным проектом и внедрить модель CI/CD.

goofyui 11.04.2019 23:28

Я пропустил, что вы беспокоились только о хранимых процедурах, думая, что используете EF. Да, EF может вывести схемы таблиц из кода приложения и сгенерировать операторы SQL, но это не обязательно. Вы можете просто встроить файлы sql в качестве ресурсов и запустить необработанный sql во время миграции.

bryanbcook 11.04.2019 23:42

это полезно, мне придется начать работать над выполнением некоторого теста для переноса только sp.. спасибо за это

goofyui 11.04.2019 23:43

Другие вопросы по теме