This blog post has also been published in English.

Sie haben sich eine perfekte Biml Solution zur Erstellung und Beladung Ihrer Staging Area erstellt. Eventuell liest diese sogar bereits vollautomatisiert aus Meta-Tabellen aus, welche Tabellen und Spalten Sie aus Ihren Quellsystemen abfragen und übertragen möchten. Gerade am Anfang entstehen jedoch immer wieder Tabellen die Sie letztendlich nicht benötigen.

In einem späteren Produktiveinsatz ist ein direktes löschen dieser Objekte zwar nicht immer zwingend der gewünschte Effekt, in der Aufbauphase ist es aber unter Umständen eine große Hilfe.

Ein einfacher Weg dies zu erreichen ist, alle durch die Biml Solution erstellten Tabellen einfach zu markieren und dann bei der Neu-Erstellung der Staging Area alle betroffenen Tabellen entsprechend zu löschen.

Hierzu kann den Tabellen einfach mittels sp_addextendedproperty eine erweiterte Eigenschaft (Extended Property) mitgegeben werden über die in der Folge dann gefiltert werden kann.

Wie sieht das im Quellcode aus?

	<#@ template tier="2" language="VB" #>
	<#@ import namespace="System.Data" #>
	<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()#>
							GO
							EXEC sys.sp_addextendedproperty @name=N'BimlGenerated', @value=N'True' , @level0type=N'SCHEMA',@level0name=N'<#= table.schema #>', @level1type=N'TABLE',@level1name=N'<#= table.name #>'
						</DirectInput>
	                </ExecuteSQL>
	                <# next #>
	                <# dim targetConnection as AstDbConnectionNode  = RootNode.Connections("Target") 
					   dim epsql as string = "SELECT  objname FROM fn_listextendedproperty (NULL, 'schema', 'dbo', 'table', default, Null, NULL) where name = 'BimlGenerated' and value='True' and objtype='Table'"
					Dim DT as DataTable  = ExternalDataAccess.GetDataTable(targetConnection.ConnectionString, epsql)
	  				for each DR as datarow in dt.rows 
					dim tbl as string = dr.item(0) 
					if Rootnode.tables(tbl) is nothing then  #>
	                <ExecuteSQL  Name="Remove <#= tbl #>" ConnectionName="Target">
	                    <DirectInput>IF EXISTS (SELECT * from sys.objects WHERE object_id = OBJECT_ID(N'[dbo].<#= tbl #>') AND type IN (N'U'))
							DROP TABLE [dbo].<#= tbl #>
							GO								
						</DirectInput>
	                </ExecuteSQL>
	                <#  end if
						   next #>
	            </Tasks>
	        </Package>
	    </Packages>
	</Biml>

Zunächst wurde dem Creation-Block einfach eine Code-Zeile hinzugefügt, welche alle Biml-Tabellen mit einem Flag kennzeichnet. In einem zweiten Block werde alle Tabellen abgefragt, die das entsprechende Flag besitzen aber nicht mehr in den Biml-Objekten enthalten sind. Diese werden daraufhin automatisch entfernt.

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!