Import BACPAC File Created from Azure SQL Database

Import BACPAC File to On-Premise SQL Server :

C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin>
SqlPackage.exe /a:import /sf:\\Userdb0.bacpac /tsn:SERVER-SQL\DEV2016 /tdn:Azure_Test /p:CommandTimeout=2400

 

Error :

When you are try to import BACPAC File created from Azure Environment, you might encounter the following error if it consists of External Data Source Reference.

TITLE: Microsoft SQL Server Management Studio
——————————

Could not import package.
Warning SQL72012: The object [AzureProd] exists in the target, but it will not be dropped even though you selected the ‘Generate drop statements for objects that are in the target database but that are not in the source’ check box.
Warning SQL72012: The object [AzureProd_Log] exists in the target, but it will not be dropped even though you selected the ‘Generate drop statements for objects that are in the target database but that are not in the source’ check box.
Error SQL72014: .Net SqlClient Data Provider: Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ‘EXTERNAL’.
Error SQL72045: Script execution error. The executed script:
CREATE EXTERNAL DATA SOURCE [DB_EXT_EDS]
WITH (
TYPE = RDBMS,
LOCATION = N’sqlserver.database.windows.net’,
DATABASE_NAME = N’AdventureWorks’,
CREDENTIAL = [DB_EXT_CRED]
);

Solution :

Drop external Tables and External Data Source in Azure SQL Database and create BACPAC File again without those references.

IF EXISTS
(
SELECT 'x' FROM sys.external_tables)
BEGIN
DROP EXTERNAL TABLE EXT_Table1
DROP EXTERNAL TABLE EXT_Table2
DROP EXTERNAL TABLE EXT_Table3
END

IF EXISTS
(
SELECT * FROM sys.external_data_sources
WHERE name ='DB_EXT_EDS'
)
BEGIN
DROP EXTERNAL DATA SOURCE DB_EXT_EDS;
END

If you can’t recreate BACPAC without dropping the tables, you can follow these steps.

1. Change the file extension to zip, then decompress it into a folder. Surprisingly, a bacpac is actually just a zip file, not something proprietary and hard to get into.
2. Find the model.xml file and edit it to remove the section that looks like this:

<Element Type=”SqlExternalDataSource” Name=”[BoxDataSrc]”>
<Property Name=”DataSourceType” Value=”1″ />
<Property Name=”Location” Value=”MYAZUREServer.database.windows.net” />
<Property Name=”DatabaseName” Value=”MyAzureDb” />
<Relationship Name=”Credential”>
<Entry>
<References Name=”[SQL_Credential]” />
</Entry>
</Relationship>
</Element>

If you have multiple external data sources of this type, you will probably need to repeat step 3 for each one. I only had one.

Save and close model.xml.
Now you need to re-generate the checksum for model.xml so that the bacpac doesn’t think it was tampered with (since you just tampered with it). Create a PowerShell file named computeHash.ps1 and put this code into it.

$modelXmlPath = Read-Host "model.xml file path"
$hasher = [System.Security.Cryptography.HashAlgorithm]::Create("System.Security.Cryptography.SHA256CryptoServiceProvider")
$fileStream = new-object System.IO.FileStream ` -ArgumentList @($modelXmlPath, [System.IO.FileMode]::Open)
$hash = $hasher.ComputeHash($fileStream)
$hashString = ""
Foreach ($b in $hash) { $hashString += $b.ToString("X2") }
$fileStream.Close()
$hashString

Run the PowerShell script and give it the filepath to your unzipped and edited model.xml file. It will return a checksum value.

Copy the checksum value, then open up Origin.xml and replace the existing checksum, toward the bottom on the line that looks like this:

<Checksum Uri=”/model.xml”>9EA0F06B282G4F42955C78A98822A31AA0ED0225CB131B8759379055A482D01G</Checksum>
Save and close Origin.xml, then select all the files and put them into a new zip file and rename the extension to bacpac.

Now you can use this new bacpac to import the database without getting the error. It worked for me, it could work for you, too.

References :

https://stackoverflow.com/questions/42028861/error-importing-azure-bacpac-file-to-local-db-error-incorrect-syntax-near-extern

https://blogs.msdn.microsoft.com/azuresqldbsupport/2017/08/16/editing-a-bacpac-file/

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *