Недавно я отвечал за развертывание веб-приложения, использующего SQL Server. Для удобства Backend должен автоматически понимать, ожидается ли структура базы данных при первом запуске; в противном случае база данных должна быть создана программно до того, как будет реализована основная логика Backend.

В среде разработки я обычно использую команды резервного копирования и восстановления в SQL Server Management Studio (SSMS) следующим образом:

Файл резервной копии будет представлять собой двоичные данные (в отличие от текстовых файлов). В моем случае развертывания база данных должна быть настроена программно; таким образом, исключая использование SSMS. Хотя можно обойти это с помощью sqlcmd.exeс соответствующим скриптом Sql, этот исполняемый файл не всегда доступен, особенно Backend и SQL Server - это разные машины.

Но эй, мой Backend написан на F# с .NET Core, почему бы мне просто не использовать SqlConnection (ссылка) и SqlCommand (ссылка), которые уже широко используются в коде, чтобы восстановить база данных?

Затем остается подготовить правильный сценарий Sql для выполнения с использованием вышеупомянутых классов .NET. Один из вариантов — восстановить с помощью команды commandRESTORE DATABASE(ссылка); однако большим недостатком этого подхода является хранение бинарного файла резервной копии где-то, что явно неудобно. Итак, было решено, что базу данных можно структурировать с помощью старых добрых команд, таких как CREATE DATABASE(ссылка) или CREATE TABLE (ссылка).

Одно можно сказать точно: мы не должны перебирать все параметры базы данных/таблицы, разбираться в них и вручную писать CREATE DATABASE, CREATE TABLEсебе. SQL Server должен каким-то образом сгенерировать его для нас. Мне потребовалось некоторое время, чтобы понять, что SQL Server не поддерживаетодно единственное место (в своем графическом интерфейсе) для создания сценария, который создает оба базу данных и ее таблицы.

На самом деле, это двухэтапный процесс:

Выполнив эти 2 скрипта с помощью ExecuteNonQuery() (ссылка), мы получим желаемое состояние базы данных.

Подразумеваемым преимуществом использования сценария Sql с открытым текстом является большая прозрачность, а также большая гибкость и контроль над тем, что будет создано в базе данных (обратите внимание на диалоговое окно «Дополнительные параметры сценария»). Типичным вариантом использования является вариант Types of data to script, мы выбираем Schema only, потому что данных в среде разработки может быть излишне много и в основном для целей тестирования. Но мы все еще хотим иметь несколько начальных строк в некоторых таблицах; сценарий Sql представляет собой обычный текст, что упрощает добавление дополнительных INSERT INTO SomeTable.

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

Проверенная версия: SQL Server 2017, SSMS v17.9.1, F# с .NET Core v2.1.