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!