Недавно я отвечал за развертывание веб-приложения, использующего 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.