Введение: «Так исторически сложилось»

Представьте: вы работаете в крупной компании с федеральной сетью. У вас более 300 баз данных Microsoft SQL Server, сотни тысяч объектов — таблиц, процедур, функций, триггеров. Значительная часть бизнес-логики реализована с использованием cross-database references и распределённых запросов через linked servers, что создаёт сложные зависимости между объектами на разных базах и даже серверах.

А теперь представьте, что все изменения в схему вносятся напрямую в production — через SSMS, без версионирования, без ревью, без возможности отката.

Звучит как кошмар? Но именно так работала наша команда более 10 лет.
«Так исторически сложилось» — и это было нормой. Такой подход неизбежно порождал инциденты: от локальных нарушений целостности данных до масштабных простоев, напрямую влияющих на выручку и репутацию компании.

Мы поняли: нужно внедрять CI/CD. Но главная проблема оказалась не в технологиях — а в людях.

Почему стандартные инструменты не сработали

Flyway и Liquibase — отличные инструменты. Однако они предполагают, что каждый разработчик вручную пишет и согласует SQL-миграции. Это прекрасно работает в мире микросервисов, но в нашей реальности — неработоспособно:

  • каждую неделю вносятся тысячи изменений в десятки баз;

  • над схемами одновременно работают десятки разработчиков;

  • изменения пересекаются, конфликтуют и зависят друг от друга через linked servers и cross-database связи.

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

Я понял: если миграции требуют от разработчика дополнительных усилий, они не приживутся. Чтобы CI/CD заработал, генерация миграций должна быть автоматической, прозрачной и безопасной. Разработчикам нужен мощный ассистент. Только так можно сделать процесс устойчивым — а не демотивирующим.

Решение: SchemaFlow AI — платформа, а не просто скрипт

Я разработал SchemaFlow AI — enterprise-платформу, которая превращает хаос в управляемый workflow. Главная идея проста: разработчик делает то, что умеет — пишет SQL-код. А всё остальное берёт на себя система.

Основной вид позволяет легко искать нужные репозитории.
Основной вид позволяет легко искать нужные репозитории.
История всех миграций и коммитов — всегда под рукой.
История всех миграций и коммитов — всегда под рукой.
Быстрый доступ к деталям каждой миграции.
Быстрый доступ к деталям каждой миграции.

Как это работает — по шагам

1. Подключение в несколько кликов

Мы сделали всё максимально просто. Подключение базы к сервису, экспорт схемы, создание репозитория в GitLab и настройка пайплайнов — всё происходит за несколько кликов через мастер.

Шаг 1: выбор MSSQL-сервера из списка доступных.
Шаг 1: выбор MSSQL-сервера из списка доступных.
Шаг 2: выбор одной или нескольких баз на сервере.
Шаг 2: выбор одной или нескольких баз на сервере.
Перед подключением система просит создать пользователя с минимальными правами. Для удобства она автоматически генерирует SQL-скрипт, который нужно выполнить на сервере.
Перед подключением система просит создать пользователя с минимальными правами. Для удобства она автоматически генерирует SQL-скрипт, который нужно выполнить на сервере.
Пользователь создан — база готова к подключению.
Пользователь создан — база готова к подключению.
Дальше все сделает система: создаёт репозиторий в GitLab -> настраивает CI/CD-переменные и пайплайны -> экспортирует всю схему -> создаёт структуру репозитория -> инициализирует Flyway
Дальше все сделает система: создаёт репозиторий в GitLab -> настраивает CI/CD-переменные и пайплайны -> экспортирует всю схему -> создаёт структуру репозитория -> инициализирует Flyway
Готово!
Готово!
Получен полностью настроенный CI/CD-репозиторий.
Получен полностью настроенный CI/CD-репозиторий.
Пайплайны prepare и deploy уже готовы к работе.
Пайплайны prepare и deploy уже готовы к работе.

2. Работа как обычно

Разработчик клонирует репозиторий и продолжает работать привычными средствами.

Клонирование репозитория — стандартная операция.
Клонирование репозитория — стандартная операция.
Структура: все объекты организованы по схемам и типам внутри папки objects.
Структура: все объекты организованы по схемам и типам внутри папки objects.
Новые объекты создаются так же, как и раньше — привычными разработчику средствами.
Новые объекты создаются так же, как и раньше — привычными разработчику средствами.

3. AI генерирует миграцию

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

Процесс генерации миграции происходит в два этапа:

  1. Планирование
    SchemaFlow AI строит детальный план миграции: определяет все необходимые действия — CREATE, ALTER, DROP — с учётом зависимостей между объектами. Результат сохраняется в виде человекочитаемого документа:review/V{номер}_review.md.Этот файл служит основой для код-ревью: инженеры могут проверить логику изменений, убедиться в корректности порядка операций и оценить потенциальные риски — до выполнения любого SQL-кода.

  2. Генерация
    На основе утверждённого плана SchemaFlow AI создаёт готовый SQL-скрипт миграции, совместимый с Flyway:flyway/sql/V{номер}__*.sql.Скрипт содержит команды в правильной последовательности, безопасен для применения и учитывает особенности MSSQL (включая работу с linked servers, схемами, зависимостями и т.д.).

Оба файла — и план, и скрипт — автоматически коммитятся обратно в репозиторий. Это обеспечивает полную прозрачность, воспроизводимость и соответствие принципам Database-as-Code и GitOps.

4. Ревью и деплой

Ответственный за миграцию проводит ревью файла миграции, в этом ему помогает review.md — с описанием изменений, рисками, рекомендациями.

Файл ревью с простым и удобным описанием предстоящей миграции + оценка рисков.
Файл ревью с простым и удобным описанием предстоящей миграции + оценка рисков.
Корректно подготовленный скрипт миграции. Approved!
Корректно подготовленный скрипт миграции. Approved!
Deploy to prod!
Deploy to prod!
Проверяем, что все объекты создались.
Проверяем, что все объекты создались.

Аналитика и контроль

Аналитический дашборд показывает активность, тренды, риски и метрики эффективности.
Аналитический дашборд показывает активность, тренды, риски и метрики эффективности.

Здесь — «непаханое поле»: всё ограничивается лишь вашей фантазией и потребностями бизнеса.

Почему это сработало: фокус на удобстве

  • Нет обучения: разработчику не нужно осваивать новые парадигмы — он работает как раньше.

  • Нет страха: система берёт на себя рутину и риски, связанные с зависимостями.

  • Нет хаоса: каждая миграция проходит ревью, версионируется и аудируется.

Команда не сопротивлялась, потому что ничего не потеряла — но получила контроль.

Заключение

Надеюсь, вам не было скучно — и, что ещё важнее, что эта статья окажется кому-то полезной и вызовет интерес.

Я занимаюсь MSSQL уже много лет в роли DBA, обожаю performance tuning, строю системы мониторинга и автоматизирую процессы. Последний год активно изучаю возможности ИИ и методы его применения в повседневной работе.

Если вам интересно — следующая статья будет про мой продукт AI QueryAnalyzer и о том, как он помогает командам находить проблемный код и оптимизировать запросы.

Спасибо за внимание! Если вы дочитали до сюда — я искренне надеюсь, что не зря потратил ваше время.

Комментарии (37)


  1. alan008
    23.01.2026 05:17

    Если скрипт изменения строит сама эта система, я не до конца понял, что находится в первичном коммите от человека, как описано изменение базы, чтобы на его основе система начала строить скрипт разницы с другими схемами?


    1. apatkin Автор
      23.01.2026 05:17

      Давайте объясню на примере. Допустим, разработчику нужно добавить новый столбец в таблицу. В классическом подходе с Flyway он создаёт или редактирует файл миграции — например, V005__add_column.sql — и пишет туда просто ALTER TABLE ... ADD COLUMN. Всё понятно: тимлид видит этот файл, понимает, что добавляется столбец, апрувит — и обновление выкатывается. Пока всё работает.

      Но теперь представим, что нужно изменить хранимую процедуру. Тогда в файл миграции придётся вставить полный текст новой версии: ALTER PROCEDURE ... и далее — весь код процедуры, который может занимать 1000+ строк. Для Git это просто новый файл, и в diff’е не видно, что именно изменилось. Чтобы понять разницу, тимлиду приходится вручную сравнивать старую и новую версию — брать объект из базы, брать новую версию, запускать сравнение. Это долго, утомительно и легко пропустить важное.

      А если таких изменений — десятки или сотни в день, а разработчиков — десятки? Каждый из них должен не только внести правки в логику, но ещё и аккуратно воссоздать их в виде миграционного скрипта, соблюдая порядок, зависимости, учтя все нюансы. Он вынужден держать всё в голове и потом «переписывать» свои изменения в файл миграции — причём так, чтобы не конфликтовать с тем, что делают коллеги. Это крайне сложно и демотивирующе.

      Именно эту проблему и решает SchemaFlow. Разработчик больше не работает с миграциями. Он просто правит файлы объектов — например, objects/dbo/Procedures/GetReport.sql — как обычные SQL-файлы. Git фиксирует реальные изменения: вот здесь добавлен JOIN, здесь удалён параметр, здесь исправлен фильтр. Всё видно в diff’е, как в любом другом коде.

      В день деплоя тимлид запускает пайплайн prepare. Система сравнивает текущее состояние репозитория (которое отражает желаемую схему) с последним зафиксированным состоянием базы, выявляет точный список изменений, анализирует зависимости — включая cross-database и linked servers — и генерирует два файла:

      — человекочитаемый отчёт для ревью: «Изменена процедура X: добавлен JOIN к Y, удалён параметр Z»,
      — готовый SQL-скрипт миграции, который Flyway выполнит на базе.

      Таким образом, разработчик делает то, что умеет — пишет логику. А вся рутина — генерация, упорядочивание, проверка зависимостей, подготовка к ревью — ложится на систему. И это масштабируется даже при сотнях тысяч объектов и десятках разработчиков.


      1. Botanegg
        23.01.2026 05:17

        Если вам нужны сотни миграций бд в день - у вас, к сожалению, что-то не так


      1. ychu
        23.01.2026 05:17

        Но теперь представим, что нужно изменить хранимую процедуру. Тогда в файл миграции придётся вставить полный текст новой версии: ALTER PROCEDURE ... и далее — весь код процедуры, который может занимать 1000+ строк. Для Git это просто новый файл, и в diff’е не видно, что именно изменилось. Чтобы понять разницу, тимлиду приходится вручную сравнивать старую и новую версию — брать объект из базы, брать новую версию, запускать сравнение. Это долго, утомительно и легко пропустить важное.

        Так не надо делать, для этого есть Repeatable migrations https://documentation.red-gate.com/fd/repeatable-migrations-273973335.html .

        Таким образом, разработчик делает то, что умеет — пишет логику.

        Используя Repeatable migrations он именно этим и будет заниматься... )


  1. debagger
    23.01.2026 05:17

    Самое интересное осталось за кадром. На сколько я понял, план миграции и скрипт генерирует LLM.

    Какая модель используется?

    Каким образом формируется контекст?


    1. camelarius
      23.01.2026 05:17

      Вероятно AI это инициалы автора, а не то что вы подумали. Кликбейт. Ну может ревью выхлопа diff-ов чем то рисуется


      1. apatkin Автор
        23.01.2026 05:17

        Нет, так просто совпало) LLM как раз берет всю рутину на себя. Сервис локально держит свою версию репозитория, которая равна состоянию базы, получает список diff-ов которые произошли в Git и формирует T-SQL скрипт миграции со всеми изменениями. После этого, происходит деплой этого скрипта в базу.


        1. alan008
          23.01.2026 05:17

          Если скрипт изменений генерит LLM, значит он может быть косячный (содержать не все изменения, просто быть некорректным, упоминать какие-то несуществующие таблицы/столбцы и т.д.) Правильно понимаю, что проверка итогового скрипта производится уже вручную человеком? Если да, то в чем суть этой проверки, попытка выполнить весь скрипт целиком в транзакции, а если ошибки - то откат и ручное разгребание уже по шагам?


          1. apatkin Автор
            23.01.2026 05:17

            Всегда нужно тестировать то, что выкатываем на прод.


    1. apatkin Автор
      23.01.2026 05:17

      Простите, промахнулся и ответил не вам.
      Что происходит под капотом - это целая тема для новой статьи. Если коротко, что в данный момент в своих проектах я использую qwen-code, это AI агент для терминала. Он имеет множество параметров, в том числе возможность прикреплять файлы к контексту. Другими словами, контекст передается в виде подготовленных файлов (инструкция+скрипты). Дальше происходит каскадная работа сразу нескольких агентов, каждый выполняет свою часть задачи.


      1. alan008
        23.01.2026 05:17

        Стало чуть понятнее, но всё равно не до конца.

        objects/dbo/Procedures/GetReport.sql

        Вот этот файл откуда взялся? В систему контроля версий изначально выложен скрипт всех объектов базы?


        1. apatkin Автор
          23.01.2026 05:17

          Да, это происходит на этапе подключения базы. Сервис используя mssql-scripter получает скрипты всех объектов и структурирует их в папке objects.


          1. alan008
            23.01.2026 05:17

            Спасибо за пояснение. Из статьи это было совершенно неочевидно :)


            1. apatkin Автор
              23.01.2026 05:17

              Простите, первый опыт.


      1. debagger
        23.01.2026 05:17

         я использую qwen-code

        Используете облачную модель или локальную? Хватает размера контекста? Там наверно большой получается, схемы всех БД + скрипты + инструкции... Не "плывет" модель?


        1. apatkin Автор
          23.01.2026 05:17

          Qwen-code позволяет использовать облачную модель через консоль. Задача сначала разбивается на шаги и каждый шаг передается отдельному агенту. Те задачу выполняет сразу оркестр агентов, которыми управляет агент-дережор.


  1. Tzimie
    23.01.2026 05:17

    Очень интересно. Закинул своим. Единственное, от Management Studio на русском чуть не вырвало


  1. n0wheremany
    23.01.2026 05:17

    Если первоначально правили прод, то как появился diff файл, который сделал разраб - какими такими привычными средствами?

    Самое важное то где...

    Я не вижу удобного функционала, кроме как просле правок скачивать через Microsoft.SqlServer.Management.Smo.Scripter схему таблиц, функции, хранимки и тп в файлы и коммитить. Так есть лог + diff + git - ai. Вот этот коммит уже можно накатить на прод, если делить на прод и тест. Только вот всем и каждому не раздашь по песочнице.


    1. apatkin Автор
      23.01.2026 05:17

      Задача как раз и состояла в том, что-бы забрать права у разработчиков с продовых баз и запретить им вносить правки кроме как через CI/CD. Бонусом они получили полную версионность для всех объектов в БД.