This blog post has also been published in English.

Eines der praktischen Features von Biml ist die automatische Generierung von Zieltabellen innerhalb der Staging Umgebung. Mit der Methode GetDropAndCreateDdl erzeugt Biml ganz automatisch alle notwendigen DDL Befehle. Eine Quelltabelle wurde auf unicode umgestellt? Es kamen Spalten hinzu oder wurden gelöscht? Kein Problem – Biml löst dieses Thema mit einem Klick.

Was passiert jedoch mit eigens in der Staging Umgebung angelegten Indizes? Werden diese hierbei immer gelöscht?

Nicht zwingend! Sie müssen Biml nur “informieren”, dass es den Index gibt. Hierfür sind einige wenige Schritte zu befolgen.

– Prüfung, ob es die Tabelle in der Staging Umgebung schon gibt. Falls nicht hat sie auch noch keinen Index :)
– Falls sie existiert, durchläuft man eine Schleife über alle Indizes der Tabelle
– Für jede Spalte des jeweiligen Index ist zu prüfen, ob es auch diese noch geben wird
– Falls ja, soll Biml einen entsprechenden Index-Tag erzeugen

Wie sieht das im Quellcode aus?

<#@ template language="VB" tier="2" #>
<#@ import namespace="System.Data" #>
<# dim targetConnection as AstDbConnectionNode  = RootNode.Connections("Target") 
dim srcconn as AstDbConnectionNode  = RootNode.Connections("AdventureWorks") 
dim tblname as string
Dim ImportTables As new List(of String)
ImportTables.add("Person") #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
	<Tables>
		<# dim importResult as Importresults = srcconn.GetDatabaseSchema(nothing,ImportTables,ImportOptions.ExcludeIdentity or ImportOptions.ExcludePrimaryKey  or ImportOptions.ExcludeUniqueKey or ImportOptions.ExcludeColumnDefault or ImportOptions.ExcludeIndex or ImportOptions.ExcludeCheckConstraint or ImportOptions.ExcludeForeignKey) 
		   for each table as asttablenode  in importResult.TableNodes
		   tblname = "AW_" & table.schema.name & "_" & table.name #>
		<Table Name="<#= tblname#>" SchemaName="MyBiml_Destination.dbo">
			<Columns>
				<#=table.columns.GetBiml()#>
			</Columns>
			<Indexes>
			<# if targetConnection.ImportDB(nothing,tblname).TableNodes.count > 0 then
		 	   for each idx as AstTableIndexNode in targetConnection.ImportDB(nothing,tblname).TableNodes(0).indexes #>
				<Index Name="<#=idx.name #>"  Clustered="<#= idx.clustered.tostring.tolower #>" Unique="<#= idx.unique.tostring.tolower #>">
					<Columns>
						<# for each idxcol as AstTableIndexColumnNode in idx.columns 
						if not table.columns(idxcol.Column.Name) is nothing then #>
								<#= idxcol.getbiml() #>
						<# end if 
						 next #>
                    </Columns>
				</Index>					
				<# next 
				end if#>
			</Indexes>
 		</Table>
		<# next #>
	</Tables>
</Biml>

Dieser Code-Block fügt die Index-Informationen zu den Biml Metadaten hinzu und stellt somit auch sicher, dass bei der Neuanlage der Tabelle(n) auch die Indizes entsprechend wieder angelegt werden. Eine Veränderung an Spalten hat natürlich eventuell zur Folge, dass auch ein Index nicht mehr wie ursprünglich angedacht funktioniert – durch diese Änderung bleibt er aber zumindest erhalten!

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!