Reverse Engineering von Metadaten mit und für Biml

Reverse Engineering von Metadaten mit und für Biml

This blog post has also been published in English.

Sie haben sich also für eine metadaten-gestützte Biml Lösung zur Beladung Ihrer Staging Umgebung entschlossen, haben aber bereits eine bestehenden Staging Datenbank? Dann scheint es unnötig, die Metadaten nochmals manuell zu erheben und befüllen. Andererseits handelt es sich hierbei um einen einmalig benötigten Task und Biml verwendet man nur bei laufend benötigten Themen. Oder? Nein! In vielen Fällen bietet sich der Einsatz von Biml durchaus auch bei Eintagsfliegen an!

Ihr Datenmodell sieht vermutlich etwas anders aus, aber lassen Sie uns annehmen, dass die Metadaten für Ihre zu ladenden Tabellen in einer wie folgt aussehenden Tabelle beschrieben sind:

CREATE TABLE [dbo].[MyBimlMeta_Tables](
	[ConnectionName] [nvarchar](50) NULL,
	[SchemaName] [nvarchar](50) NULL,
	[TableName] [nvarchar](50) NULL,
	[Columns] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Für jede Tabelle die wir aus einem Vorsystem laden gibt es somit einen Datensatz.

Darüber hinaus gehen wir von folgenden Design-Richtlinien aus:

– Die Spaltennamen in der Staging Umgebung entsprechen denen der Originaldatenbanken
– Tabellen werden nach dem Schema <SRC>_<SCHEMA>_<Table> benannt, es sei denn, das Ursprungsschema ist DBO. In diesem Fall wäre der Name lediglich <SRC>_<Table>. Die Tabelle Person.Person aus der AW Verbindung würde somit AW_Person_Person benannt, die Tabelle dbo.dataarea aus der AX Verbindung wiederum AX_dataarea.

Zunächst müssen wir Biml also auf unsere bestehende Staging Datenbank lotsen:

 <Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        	<OleDbConnection Name="Source" ConnectionString="Provider=SQLNCLI11;Server=.;Initial Catalog=MyExistingStagingDatabase;Integrated Security=SSPI;" />  
	</Connections>
</Biml> 

Wir benötigen nun lediglich eine Collection aller Tabellen die im Namen das entsprechende Präfix tragen. Diese erhalten wir über die ImportDB Methode, welche SQL ähnliche Filter unterstützt.

Für jeden Eintrag in dieser Collection arbeiten wir eine einfache Liste von Aufgaben und Regeln ab:

– Der Name der Ursprungstabelle entspricht dem Namen der Staging-Tabelle nach Abzug des Verbindungspräfix
– Sofern der Tabellenname noch einen Unterstrich beinhaltet teilen wir diesen noch in Schema- und Tabellennamen auf. Andernfalls setzen wir das Schema auf DBO fest
– Dann erstellen wir ein DELETE sowie ein INSERT Statement für unsere Metadaten

Beachten Sie, dass wir diese Datei später mittels CallBimlScript mit einem Parameter für das Verbindungspräfix aufrufen:

 <#@ template language="VB" #>
<#@ property name="SRC" type="string" #>
<# Dim TableName as string
   Dim SchemaName as string
   Dim SourceConnection as AstDbConnectionNode  = RootNode.Connections("Source") 
   Dim SrcTableResults as ImportResults = SourceConnection.ImportDB(nothing,SRC + "_%") 
   for each tbl as asttablenode in srctableresults.tablenodes
   tablename = tbl.name.substring(src.length+1)
   if tablename.indexof("_") < 0 then
   	SchemaName = "DBO"
	else
	SchemaName = tablename.substring(0,tablename.indexof("_"))
	tablename = tablename.substring(tablename.indexof("_")+1)
   end if #>
   DELETE FROM MyBimlMeta_Tables WHERE Connectionname = '<#= SRC #>' and SchemaName = '<#= schemaname #>' and Tablename = '<#= tablename #>'
   INSERT INTO MyBimlMeta_Tables (Connectionname,Schemaname,Tablename,Columns) values ('<#= src #>','<#= schemaname #>','<#= Tablename #>','<#= tbl.getcolumnlist #>')
<#next#>

Nachdem wir dieses Script vermutlich nur einmalig benötigen, erstellen wir statt einem Paket einfach nur eine .sql Datei, welche dann zum Beispiel im SSMS ausgeführt werden kann:

<#@ template language="VB" #>
<# System.IO.File.WriteAllText("c:\Temp\MyBimlTables_AW.sql",CallBimlScript("02_BuildSQL.biml","AW")) #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd"/>

Dies erstellt alle erforderlichen Einträge in unserer Metadaten-Tabelle!

Haben Sie hierzu Fragen oder Anmerkungen? Wir freuen uns auf Ihren Input unter biml@solisyon.de!

Weitere Informationen zu Biml, einschließlich Terminen und Blog Beiträgen finden Sie auch auf unserer Biml Seite.

Viel Spaß beim Biml’n!

Facebook