Как импортировать резервное копирование 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; "
Заметки:
- Моя установка перечисляет exe со всеми строчными именами
sqlpackage.exe
, поэтому я использую все строчные sqlpackage
- Мой путь с VStudio 2019 на данный момент следующий, но вы можете поиграть с окончательным путем, чтобы найти свой/новейшую версию (я мог бы выбрать из ".../DAC/130" или 140 или 150):
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\150\sqlpackage.exe
- Для импортированного имени базы данных, оно не должно совпадать с тем, которое было исходным именем базы данных, поэтому "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 хорошо спроектирован для такой простой задачи восстановления базы данных, как эта, нюансы - это различия между сборкой и запуск контейнера и необходимость какого-то счастливого промежуточного положения обеих концепций для его работы.