Как импортировать резервное копирование Azure SQL (.bacpac) в LocalDB с помощью Visual Studio?

Я предполагаю, что это будет довольно распространенный сценарий, но я не могу найти, как импортировать экспортированную базу данных Azure SQL (.bacpac) в мой LocalDB в Visual Studio 2013. Я что-то упустил или Visual Studio что-то упустил?

(Примечание: здесь есть решения, когда у вас есть студия управления SQL Server, но у меня ее нет, и я предпочитаю не устанавливать ее, если это возможно.)

Ответ 1

Если у вас есть эта папка на вашем компьютере C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin, вы можете запустить эту команду, чтобы восстановить файл bacpac:

.\SqlPackage.exe /Action:Import /SourceFile:"c:\temp\your.bacpac" /TargetConnectionString:"Data Source=(localdb)\v11.0;Initial Catalog=devdb; Integrated Security=true;"

Если эта папка отсутствует, вам нужно будет загрузить инструмент от Microsoft.

Ответ 2

Для меня правильной командой было:

.\SqlPackage.exe /Action:Import /SourceFile:"c:\temp\your.bacpac" /TargetConnectionString:"Data Source=(localdb)\mssqllocaldb;Initial Catalog=DBNAME;Integrated Security=true;"

В противном случае я получаю сообщение об ошибке: *** Error importing database:Could not import package. Unable to connect to master or target server 'DBNAME'. You must have a user with the same password in master or target server 'DBNAME'.

Использование VS2015 в месте, заданном anjdreas:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\130

Ответ 3

Если вы хотите использовать это более одного раза, вы можете добавить sqlpackage к переменным окружения, что позволит вам запускать sqlpackage как команду из любой папки.

Смотрите здесь, как добавить путь к переменным окружения, это не так уж сложно.

Тогда вы можете просто запустить: sqlpackage из любого места! Чтобы протестировать после добавления, просто откройте командную строку или powershell из любой папки и введите sqlpackage, и вы должны получить что-то вроде этого (не забудьте сначала закрыть все ранее открытые приглашения, чтобы они могли получить изменения):

running <code>sqlpackage</code> from anywhere

Полный сценарий тогда:

sqlpackage/Action: Import/SourceFile:"C:...\SOMEDBBACKUP.bacpac "/TargetConnectionString:" Источник данных = (localdb)\mssqllocaldb; Начальный каталог = bac_give_dbimport_any_name_you_want; Интегрированная безопасность = true; "

Заметки:

  1. Моя установка перечисляет exe со всеми строчными именами sqlpackage.exe, поэтому я использую все строчные sqlpackage
  2. Мой путь с VStudio 2019 на данный момент следующий, но вы можете поиграть с окончательным путем, чтобы найти свой/новейшую версию (я мог бы выбрать из ".../DAC/130" или 140 или 150):

C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\150\sqlpackage.exe

  1. Для импортированного имени базы данных, оно не должно совпадать с тем, которое было исходным именем базы данных, поэтому "bac_give_dbimport_any_name_you_want" может быть любым, что вы захотите.

Ответ 4

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

Учитывая ваше использование docker и если вы хотите скомпилировать проект Visual Studio внутри контейнера, при определенных комбинациях базовой ОС контейнера и образа может оказаться невозможным создать файл dacpac с помощью msbuild.

Вы можете обойти восстановление базы данных с помощью ряда команд на основе Unix, отметив, что проект базы данных Visual Studio обычно представляет собой просто серию файлов SQL, ниже я покажу пример этого, где я объединяю файлы SQL в один файл. и вызовите sqlcmd для запуска скрипта;

FROM mcr.microsoft.com/mssql/server
WORKDIR /init
ENV ACCEPT_EULA=Y
ENV MSSQL_SA_PASSWORD=MyPassword
EXPOSE 1433:1433
RUN  apt-get update && apt-get install dos2unix
COPY /solution_folder/database/Tables/*.sql /init/
WORKDIR /database
RUN echo "CREATE DATABASE [database_name];\nGO\nUSE [database_name];\n' >> /database/create.sql
RUN for f in /init/*.sql; do dos2unix $f;  cat $f >> /database/create.sql; echo "\nGO\n" >> /database/create.sql; done
RUN ( /opt/mssql/bin/sqlservr --accept-eula & ) | grep -q "Service Broker manager has started"  && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P ‘MyPassword -i /database/create.sql && pkill sqlservr

Причина "dos2unix" заключается в том, что файлы SQL, созданные в Visual Studio, имеют уникальные скрытые символы cr/lf (и другие символы), которые версия sqlcmd для Linux не будет интерпретировать успешно и приведет к ошибкам (что довольно странно). и это именно то, что вы хотели бы, чтобы кроссплатформенная база данных могла справиться с этим)

Кроме того, в рамках команды заключительного запуска вы должны временно запустить службу сервера SQL, иначе вы также получите ошибки; Это немного обходной путь, и немного сложновато, и я не совсем уверен, что контейнер Microsoft Linux SQL Server Linux хорошо спроектирован для такой простой задачи восстановления базы данных, как эта, нюансы - это различия между сборкой и запуск контейнера и необходимость какого-то счастливого промежуточного положения обеих концепций для его работы.