En esta entrada continuamos las contribuciones a la serie PowerShell y SQL BI.

Como vimos en la entrada anterior con unas pocas lineas de código PowerShell podemos extraer el MDXScript de un cubo en un comando XMLA ALTER y además de modificarlo. En esta ocasión vamos a analizar dos formas de enviar comandos XMLA al cubo para su ejecución controlando la salida (ejecución correcta o con errores). En tareas de despliegue es muy habitual el envio de comandos XMLA, tanto ALTER si es un despliegue incremental, como CREATE si se trata de un primer despliegue. Estas son

  • Utilizar ADOMD, es un ensamblado distribuible que podemos instalar de forma independiente, sin requerir ninguna herramienta adicional. Se descarga de forma gratuita desde los Feature Packs (SQL Server 2014 SP1 Feature Pack)
  • Utilizar el ensamblado Microsoft.AnalysisServices.XMLA. No existe mucha documentación acerca de este ensamblado, por lo que su uso no es tan común. Lo tendremos a nuestra disposición solo si hemos activado la característica Management Tools – complete durante la instalación de SQL Server.

Advertencia. El código provisto en esta página no debe ejecutarse en un entorno de producción, no tiene ninguna garantía de que os vaya a funcionar como esperáis.

Ejecutar XMLA con ADOMD

Aqui teneis el script, mirad los comentarios para orientaros:

#Ejecutar comandos XMLA con ADOMD

#Declarar variables
$InstanceName= "localhost\sql2016"
$FileSuffix=(get-date).ToString("yyyyMMddhhmmss")
$XmlaCommand = @"
<Backup xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
  <Object>
    <DatabaseID>AdventureWorksDW2012Multidimensional-EE</DatabaseID>
  </Object>
  <File>D:\SQL\Backups\AdventureWorksDW2012Multidimensional-EE_$FileSuffix.abf</File>
</Backup>

"@
Clear-Host

#Cargar ensamblado AdomdClient
$AsmLoadStatus= [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices.AdomdClient")
$AsmLoadStatus.Location

#Si conocemos la versión exacta del esamblado disponible en el sistema, es preferible utilizar el cmdlet add-type
#Add-Type -AssemblyName "Microsoft.AnalysisServices.AdomdClient, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"

#Establecemos cadena de conexión
$ConnectionString="Provider=MSOLAP.3;Data source=$InstanceName;"

#Instanciamos un objeto AdomdConnection con la cadena de conexión
$Connection = New-Object Microsoft.AnalysisServices.AdomdClient.AdomdConnection($ConnectionString)
$Connection.Open();

#Creamos un comando y asignamos sus propiedades
$Comand = $Connection.CreateCommand();
$Comand.CommandType = [System.Data.CommandType]::Text;
$Comand.CommandText = $XmlaCommand;

#Un poco de log por aqui
write-host "[$InstanceName] Executing script...  " -fore yellow

#Enviamos el comando a la instancia
$Reader = $Comand.ExecuteXmlReader();
$Reader.ReadOuterXml()

Si el resultado es correcto obtendremos algo similar a lo siguiente.

image

En caso contrario se mostrará el error.

Ejecutar XMLA con XmlaClient

Como se puede observar, el siguiente script PowerShell es parecido al anterior con la diferencia de que se utiliza el objeto XmlaClient.

#Cargar ensamblado XmlaClient
$AsmLoadStatus= [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices.Xmla") 
$AsmLoadStatus.Location

#Instanciamos el objeto XmlaClient
[Microsoft.AnalysisServices.xmla.xmlaclient]$xmlac = new-Object Microsoft.AnalysisServices.Xmla.XmlaClient 

#Conectamos XmlaClient con la instancia
$xmlac.Connect("$InstanceName")

#Un poco de log por aqui
write-host "[$InstanceName] Executing script...  " -fore yellow

#Enviamos el comando XMLA a la instancia a través del XmlaClient
$xmlac.send($XmlaCommand, $null)

Diferencias XmlaClient y AdoMD

Es una buena pregunta, si prácticamente hacen lo mismo ¿qué beneficio tiene utilizar uno u otro esamblado?

XmlaClient es un cliente puro de XMLA, con métodos para interactuar con el formato nativo de Analysis Services, como Discover(). Es más ligero que el cliente ADOMD claro que los metodos disponibles también son mucho más limitados. El problema con la DLL Microsoft.AnalysisServices.Xmla es que la documentación brilla por su ausencia.

Como curiosidad, paseando por el blog de Adam W. Saxton (Twitter) dí con una entrada que habla de esta DLL como parte de un problema que estaba afrontando respecto a Power Pivot en SharePoint, en la versión SQL2012 del componente. Os dejo el enlace a esa entrada: http://blogs.msdn.com/b/psssql/archive/2012/12/05/filenotfoundexception-with-microsoft-analysisservices-xmla.aspx Es de lo poco que he encontrado referente a esta DLL que venga de Microsoft.

Por otra parte el cliente ADOMD esta fuertemente documentado y es un recurso muy utilizado por los programadores para realizar todo tipo de operaciones con bases de datos OLAP y los objetos allí  contenidos. Se puede disponer de esta DLL a través de la instalación del componente ADOMD desde la página de descarga los Feature Pack  de cada versión (2014, 2012 SP2, 2008R2, 2008, 2005).

Concluyendo

Sea cual sea la forma por la que optemos para ejecutar comandos XMLA, lo que me parece interesante es conocer que disponemos de varias opciones y como explotarlas a través de PowerShell.

Podemos realizar una buena colección de tareas a través de comandos XMLA como crear un backup de una BBDD OLAP –que es el ejemplo utilizado arriba—, procesar dimensiones o grupos de medidas, etc..

También es posible crear o modificar roles y membresía a través de comandos XMLA aunque, en mi opinión, estas tareas son más fáciles de acometer con el modelo de objetos de Análisis Services. Este tema lo veremos en otra entrada.

Serie de artículos PowerShell y SQL BI:

Víctor M

Víctor is an experienced Mentor and consultant working in the Business Intelligence division and collaborating in projects globally. He began working with ERP products in financial areas around year 2000, focused on development with Microsoft technologies: Visual Basic and SQL Server 2000. He has been involved in data modelling, integration and analysis through all later versions of SQL (2005/2008/R2/2012). Prior join SolidQ he has been in charge of the area of BI managing
development teams. He have strong technical skill with business focus and able to management.