This blog post has also been published in English.

Sofern Sie bereits Biml Anwender sind, so haben Sie sicherlich bereits mehrfach die GetDropAndCreateDdl Funktion genutzt. Diese übernimmt effektiv alles notwendige (inkl. Indices etc.), um Ihre Zieltabellen in der Staging Umgebung anzulegen, was sie zu einer gleichermaßen einfachen wie auch mächtigen Funktion macht.

Vermutlich nutzen Sie einen ähnlichen Quellcode wie diesen:

<#@ template tier="2" language="VB" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Packages>
        <Package Name="01_CreateStaging" ConstraintMode="Parallel">
            <Tasks>
                <# for each table as asttablenode in RootNode.Tables  #>
                <ExecuteSQL Name="Create <#=table.Name#>" ConnectionName="Target">
                    <DirectInput><#=table.GetDropAndCreateDdl()#></DirectInput>
                </ExecuteSQL>
                <# next #>
             </Tasks>
        </Package>
    </Packages>
</Biml>

Aber warum soll man jede Tabelle bei jedem Durchlauf komplett neu erstellen? Neben dem nicht zu vernachlässigendem zusätzlichen IO könnte dies bedeuten stundenlang alle Daten neu zu laden, nur weil in einer kleinen Tabelle mit 3 Zeilen eine Spalte hinzugekommen ist.

Um genau das zu verhindern müssen wir nur prüfen, ob es Änderungen an den Tabellen gab:

– Existiert die Tabelle bereits?
– Falls ja, stimmt die Spaltendefinition zwischen Biml Metadaten und der Staging Umgebung noch überein?

Falls eine der beiden Fragen mit “Nein” zu beantworten ist, legen wir die Tabelle neu an – andernfalls nicht. Dies erfordert nur wenige Zeilen zusätzlichen Code:

<#@ template tier="2" language="VB" #>
<# dim desttable as asttablenode
dim desttableresults as ImportResults
dim TableExists as boolean = false
dim targetconnection as AstDbConnectionNode = rootnode.connections("Target") #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Packages>
          <Package Name="01_CreateStaging_Incremental" ConstraintMode="Parallel">
            <Tasks>
                <#	for each table as asttablenode in RootNode.Tables 
					TableExists = false
					DestTableResults= targetConnection.ImportDB(nothing,table.name) 
			   		if DestTableResults.TableNodes.count > 0 then 
			   			desttable = DestTableResults.TableNodes(0)
						if desttable.columns.getbiml = table.columns.getbiml then TableExists = true
					end if
 					if TableExists = false then #>
	                <ExecuteSQL Name="Create <#=table.Name#>" ConnectionName="Target">
	                    <DirectInput><#=table.GetDropAndCreateDdl()#></DirectInput>
	                </ExecuteSQL>
	            <# end if 
				next #>
            </Tasks>
        </Package>
    </Packages>
</Biml>

Mehr braucht es nicht, um zu vermeiden, dass Sie laufend genau das neu anlegen, was Sie zuvor bereits hatten. Ihnen spart es Zeit und dem Datenbank-Administrator Nerven :)

Haben Sie hierzu Fragen oder Anmerkungen? Wir freuen uns auf Ihren Input unter !

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

Viel Spaß beim Biml’n!