¿Problemas al restaurar BD de SQL Azure?

Si alguna vez tenéis que restaurar una copia (*.bacpac) de una SQL Azure Database a un SQL Server Local o bien de nuevo a un SQL Azure, podría ser que os encontrarais con el siguiente error (si es que no os lo habéis encontrado ya):

Could not import package.
Error SQL72014: .Net SqlClient Data Provider: Msg 33161, Level 15, State 1, Line 1 Database master keys without password are not supported in this version of SQL Server.
Error SQL72045: Script execution error. The executed script:
CREATE MASTER KEY;

Esto se debe a un comportamiento distinto entre el SQL Azure y el SQL Server local, ya que SQL Azure permite tener un master key sin password.

¿Cómo solucionar este problema?

Tenéis dos opciones:

  1. La más rápida y fácil: Instalar el SQL Server Management Studio en una versión igual o superior a la 17.6, al parecer han solucionado este problema en la versión 2017.
  2. La más costosa: Si no tenéis la suerte de poder instalar o actualizar a la versión más nueva, no os queda otra que seguir los siguientes pasos.

Pasos a seguir

  1. Renombrar el fichero .bacpac por .zip. Ej: En mi caso, “azure_db.bacpac” à “azure_db.zip”
  2. Abrir el fichero zip. Os encontrareis con algo de este estilo:

  3. Extraer los ficheros “model.xml” y “Origin.xml”. Vamos a tener que modificar el contenido de ambos.

  4. Abrir el fichero “model.xml” y eliminar las siguientes líneas que contengan:

<Element Type=”SqlMasterKey” />

Y también las que contengan los siguientes elementos:

<Element Type=”SqlDatabaseCredential” Name=”[https://xxx]”>

              <Property Name=”Identity” Value=”SHARED ACCESS SIGNATURE” />

</Element>

5. Abrir el fichero “Origin.xml” y buscar las siguientes líneas:

<Checksums>

<Checksum Uri=”/model.xml”>1F9ACBCB581CAA0761E4BBDC2F8227364A3E71A064F9089F30043A82EF866DB3</Checksum>

</Checksums>

Por seguridad, en este fichero se guarda el checksum correspondiente al fichero “model.xml”. Como este fichero lo acabamos de modificar, deberemos obtener su nuevo código hash e informarlo en el fichero “Origin.xml”.
Para obtener este código hash utilizaremos un script en Powershell.
Crear un fichero de texto con el nombre que queráis y extensión “*.ps1”.
En mi caso: “computeHash.ps1”.
Copiad estas líneas como contenido del fichero:

$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

Abrir ventana de comandos de Powershell y ejecutar el script:

Intro y añadir la ruta del fichero “model.xml”

Intro y obtendréis el nuevo código Hash, que deberéis sustituirlo en el fichero “Origin.xml”.

  1. Una vez modificados los dos ficheros, reemplazar los ficheros del Zip por estos nuevos.
  2. Revertir el cambio de extensión del fichero de “.zip” a “.bacpac”

  3. Finalmente ya tendréis el backup apunto para poder ser restaurado.  Si todo ha ido bien, ya no debería aparecer el error inicial.

Espero que os sirva de ayuda.


Jonatan Rodríguez

Software Engineer | Soluciones Microsoft | SOGETI ESPAÑA

Autor: ITblogsogeti

Sogeti es una compañía tecnológica perteneciente al Grupo Capgemini y especialista en: Testing y Calidad de Software; Soluciones Microsoft y High Tech Consulting. En Sogeti entendemos la importancia de obtener el máximo valor empresarial de sus sistemas de IT, por ello somos líderes mundiales en Testing & QA.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s