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:
- 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.
- 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
- Renombrar el fichero .bacpac por .zip. Ej: En mi caso, “azure_db.bacpac” à “azure_db.zip”
-
Abrir el fichero zip. Os encontrareis con algo de este estilo:
-
Extraer los ficheros “model.xml” y “Origin.xml”. Vamos a tener que modificar el contenido de ambos.
-
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”.
- Una vez modificados los dos ficheros, reemplazar los ficheros del Zip por estos nuevos.
-
Revertir el cambio de extensión del fichero de “.zip” a “.bacpac”
-
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.
Software Engineer | Soluciones Microsoft | SOGETI ESPAÑA
0 comments on “¿Problemas al restaurar BD de SQL Azure?”