Se ihmiselle luettavampi Business Intelligence Markup Language (Biml)

Olen perehtynyt viimeisen parin viikon aikana bimliin eli Business Intelligence Markup Languageen. Biml on Varigencen kehittämä XML-pohjainen merkintäkieli. Biml on hyvin samanluontoinen kuin SSIS-pakettien takaa löytyvä XML, mutta ihmiselle paljon luettavampaa. Biml mahdollistaa SSIS-pakettien, SQL skriptien ja SSAS-kuutioiden kehityksen ohjelmallisesti. Itse perehdyn tässä blogissa SSIS-pakettien kehitykseen.

Jos olet niinkuin minä ja tykkäät mieluummin tehdä kaiken kirjoittaen, kuin hiirellä raahaillen, niin nyt se on myös SSIS-pakettien kohdalla mahdollista. Biml kaikessa yksinkertaisuudessaa on työkalu, jonka avulla voit kirjoittaa SSIS-pakettien sisällön ja näin generoida perinteisen .DTSX -tiedoston.

Bimlillä koodailluun löytyy useampi työkalu. Varigencella on oma maksullinen editori BimlStudio, mutta myös Visual Studiolle on saatavilla lisäosia. Näistä suosituimpia lienevät Varigencen BimlExpress ja open source BI Developer Extensions. Omissa demoissani olen kokeillut vasta BimlExpressiä.

Kuinka sitä käytetään?

BimlExpressin avulla voi lisätä SSIS-projektille biml-tiedostoja. Biml-tiedostoja voi käyttää samaantapaan kuin JavaScript-tiedostoja ja yhdistellä niitä mielen mukaan. Kaikkea ei tarvitse laittaa yhteen tiedostoon vaan esimerkiksi ConnectionStringit voi siirtää omaan ”Environment.biml” -tiedostoon. Kun kokonaisuudet on tehty biml-tiedostoihin ne maalaamalla ja hiiren kakkospainiketta painamalla löytyy ”Generate SSIS Packages”, joka nimensä mukaan generoi biml-tiedostojen määrittelemät DTSX-tiedostot. Eli biml ei pois sulje myöskään perinteistä paketin muokkausta. Bimlin avulla voi yhtä hyvin tehdä paketille pelkän rungon ja käsin muokkaamalla voi pakettiin helposti lisäillä tarvittavat palikat.

Miltä se näyttää?

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection 
            Name="target" 
            ConnectionString="Data Source=localhost;Initial Catalog=Staging;Provider=SQLNCLI11;Integrated Security=SSPI;">
        </OleDbConnection> 
    </Connections>
    <Packages>
        <Package Name="Demo_Package">
            <Tasks>
                <ExecuteSQL Name="Get tables" ConnectionName="target">
                   <DirectInput>
                       SELECT * FROM sys.tables
                   </DirectInput>
                </ExecuteSQL>
            </Tasks>
        </Package>
    </Packages>
</Biml>

Tässä yksinkertainen esimerkki, jossa luodaan paketti nimeltä ”Demo_Package”, jolla on yksi ExecuteSQL-taski. Kuten esimerkistä huomaa, on tätä XML paljon helpompi lukea verrattuna paketin takaa löytyvään XML. Vielä tässä muodossa biml jää hieman vaisuksi, eikä tuo paljon muuta lisäarvoa kuin hiiren käytön jättämisen. Onneksi tämän ympärille on lisätty ruutia BimlScriptillä.

BimlScript toimii muuten samaantapaan, kuin perinteisempi biml, mutta sen kylkeen voi lisätä C# tai VB koodia. Tämä tekee bimlistä jo paljon houkuttelevamman työkalun, kun pakettien teosta tulee paljon dynaamisempaa.

Kuinkas se sitten toimii?

<#
List<string> tables = new List<string>{
    "sys.schemas",
    "sys.tables",
    "sys.columns"
};
#>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection 
            Name="target" 
            ConnectionString="Data Source=localhost;Initial Catalog=Staging;Provider=SQLNCLI11;Integrated Security=SSPI;">
        </OleDbConnection> 
    </Connections>
    <Packages>
        <Package Name="Demo_Package_v2">
            <Tasks>
                <# foreach (string table in tables) { #>
                    <ExecuteSQL Name="Get <#=table#>" ConnectionName="target">
                        <DirectInput>
                            SELECT * FROM <#=table#>
                        </DirectInput>
                    </ExecuteSQL>
                <# } #>
            </Tasks>
        </Package>
    </Packages>
</Biml>

Lisäämällä XML sekaan ”<# #>” -tagit saimme upotettua C# koodia. Näin saimme helposti tehtyä paketin, jossa on kolme ExecuteSQL-taskia joidenka nimet ja kyselyt tulevat dynaamisesti määrittelemästämme listasta.

Mitä tällä saavutetaan?

Mahdollisuuksia on todella paljon. Kaikki itseään toistavat paketit voidaan kirjoittaa parametrisoiduksi BimlScriptiksi ja näin säästetään paljon työaikaa. BimlScript sisältää myös muita mahtavia työkaluja. Esimerkiksi ympäristön toisintaminen, vaikka kehitykseen on todella helppoa.

<# var sourceConnection = RootNode.DbConnections["Source"]; #>
<# var importResults = sourceConnection.GetDatabaseSchema(ImportOptions.ExcludeForeignKey | ImportOptions.ExcludeColumnDefault | ImportOptions.ExcludeViews);#>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Packages>
        <Package Name="Create tables" ConstraintMode="Linear">
            <Tasks>
                <# foreach (var table in importResults.TableNodes) { #>
                    <ExecuteSQL Name="Create <#=table.Name#>" ConnectionName="Target">
                        <DirectInput><#=table.GetTableSql()#></DirectInput>
                    </ExecuteSQL>
                <# } #>
            </Tasks>
        </Package>
    </Packages>
</Biml>

Oheinen skripti käyttää hyväkseen tietokannan metadatoja. GetDatabaseSchema() tuo tietokannan metadatat käsiteltäviksi objekteiksi. Näin voidaan foreachilla loopittaa kaikki kannan taulut. Foreach-loopin table olio on tyyppiä AstTableNode, jonka metodi GetTableSql() palauttaa SQL-lauseen, joka tarkistaa onko kyseinen taulu jo olemassa ja jos taulu löytyy pudottaa se sen. Tämän jälkeen se luo uuden taulun metadatojen perusteella.

Edellistä esimerkkiä kokeillessani törmäsin yhteen haasteeseen koskien BimlScriptiä. Biml aina loppuviimein käännetään SSIS-paketiksi. Tällöin biml-kääntäjällä tulee olla saatavilla kaikki samat tiedot mitä SSIS-pakettiakin tehtäessä. Eli tietääkseni ei ole mahdollista tehdä pakettia, joka loisi taulut, jos ne puuttuvat ja tämän jälkeen toisi tauluihin testidataa, vaikka tuotannosta, koska tauluja ei välttämättä ole olemassa ennen paketin generoimista. Tällöin ei ole mahdollista tehdä Data Flow Taskissa mappauksia. Tämän pystyy tietysti ohittamaan sillä, että luo eri paketit taulujen luomiselle ja datan viemiselle. Tällöin on mahdollista luoda taulut ennen toisen paketin generointia.

Mitä jatkossa?

Biml tuo toivottua dynaamisuutta ssis-paketteihin. Käyttötarkoituksia ja tapoja on varmasti monia. Itse yritän jatkossa korvata yksinkertaiset taskit BimlScripteillä ja näin haen lisää ymmärrystä kyseisestä työkalusta. Lyhyen tutustumiseni jälkeen löysin myös muutamia blogeja, joissa oli hyviä esimerkkejä. Näihin perehtyessä löytyy varmasti muitakin käyttötarkoituksia ja toimintatapoja.

Tässä pari edellämainituista blogeista: https://www.solisyon.de/biml https://www.cathrinewilhelmsen.net/biml

Eniten informaatiota löytyy BimlScriptin omilta sivuilta.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *