Eigene Komponenten für SSIS (Teil 2)

28. März 2011

Teil 1 der kleinen Serie zu eigenen Komponenten in SSIS finden Sie >hier<

SQL Server Integration Services (SSIS) ist das Tool der Wahl bei  der Konsolidierung verschiedener Datenquellen. Makroskopische Aufgaben werden in SSIS zu Paketen zusammengefasst, die wiederum aus atomaren Tasks zusammengesetzt sind. Microsoft liefert bereits von Haus aus eine Vielzahl nativer Tasks mit, doch offene Architektur und .NET-Basierung ermöglichen auch Eigenentwicklungen mit vertretbarem Aufwand. In diesem Zusammenhang spricht man von Custom Components.

In Teil 1 dieser Serie haben wir das Anlegen eines Visual Studio Projektes zur Erstellung einer Custom Component und die Abfolge der Methodenaufrufe in SSIS betrachtet. Heute wollen wir die Aufgaben der wichtigsten Methoden und die Einbindung der Komponente in SSIS näher beleuchten.

Zieht der SSIS Paketentwickler eine Komponente von der Toolbox auf die Design-Fläche der Data Flow Task, so wird die Methode ProvideComponentProperties() der Komponente aufgerufen. Darin platziert der Komponentenentwickler das Anlegen von Metadaten d.h. Objekte, die die Komponente für die Erfüllung ihres Zweckes benötigt. Hierzu gehören Input- und Output-Datenflusspfade sowie Properties. Der Zugriff erfolgt über Collections der Eigenschaft ComponentMetaData, die aus der Ableitung von PipelineComponent verfügbar wird. Im Codebeispiel wird ein Standard Input- und ein Standard-Output Datenflusspfad angelegt sowie ein Custom Property “Statuswert” hinzugefügt:

   1: public override void ProvideComponentProperties()

   2: {

   3:     // Metadata entfernen soweit vorhanden

   4:     base.RemoveAllInputsOutputsAndCustomProperties();

   5:  

   6:     // Standard Input/Output Pfad mit Index 0 anlegen

   7:     base.ProvideComponentProperties();

   8:  

   9:     // Informationen für den SSIS Paketentwickler

  10:     ComponentMetaData.ContactInfo = "SDX AG, Frankfurt";

  11:  

  12:     // Eine Eigenschaft vom Typ Int32 hinzufügen

  13:     IDTSCustomProperty100 prop = ComponentMetaData.CustomPropertyCollection.New();

  14:     prop.Name = "Statuswert";

  15:     prop.Value = 0;

  16:     prop.TypeConverter = "System.Int32";

  17: }

Nach Einbindung in SSIS (siehe unten) sieht der Paketentwickler folgende Eigenschaften der Custom Component, wobei automatisch sichergestellt wird, dass nur Zahlen für Statuswert eingegeben werden können:

image

Weitere wichtige Methoden, in denen Funktionalität zu platzieren ist, sind:

  • AquireConnections() : Stellt die Verbindung zu einem Connection Manager her um Zugriff auf Datenbank-Verbindungen zu erhalten
  • PreExecute() : Mapping von Output-Spalten mit Datenpuffer-Inputspalten während der Paketausführung um Objekt-IDs für Datenzugriffe zu erhalten
  • ProcessInput() : Zugriff auf Dateninhalte während der Paketausführung
  • PostExecute() : Abschließende Aktionen wie Cleanup intern benutzter Objekte
  • ReleaseConnections() : Schließen der Verbindung zu einem Connection Manager

Eine Einführung in die konkrete Implementierung dieser und weiterer Methoden gibt das Tutorial Creating a Custom Transformation Component.

Um nun die Custom Component für SSIS verfügbar zu machen, wird die Assembly (DLL) in das SQL Server Unterverzeichnis PipelineComponents kopiert und im Global Assembly Cache registriert. Danach kann über die Toolbox im SSIS Designer die neue Komponente im Tab SSIS Data Flow Items hinzugefügt werden. Dazu sind jedoch administrative Rechte erforderlich.

image

Bei Ausführung von Komponenten in einer Data Flow Task in einer Visual Studio Debug Session beobachtet man ganz allgemein einen portionsweisen Datentransfer von einer Datenquelle zu einem Datenziel. SSIS organisiert den Datentransfer intern mit Hilfe eines Buffers, der zur Laufzeit gefüllt wird. Ist der aktuelle Buffer voll, wird er an den Input der nächsten Datenfluss Tasks weitergereicht. Daraus ergibt sich unter anderem, dass die Methode ProcessInput() mehrfach zur Laufzeit aufgerufen wird; nämlich je einmal pro Buffer und einmal abschließend. Dies ist bei der Entwicklung zu berücksichtigen.

Wie oben beschrieben, wird durch ProvideComponentProperties() jeweils ein Input- und ein Output Datenflusspfad verfügbar gemacht, so dass unsere Komponente den Inhalt des Buffers weiterreichen kann.

image

Fazit: Die Entwicklung eigener Komponenten für Integration Services ist die Königsklasse der ETL-Prozessentwicklung. Damit lassen sich spezifische Aufgaben elegant lösen und ermöglichen die Wiederverwendbarkeit in allen SSIS Paketen.

Die Entwicklung eigener Komponenten erfordert jedoch fundierte Kenntnisse SSIS interner Vorgänge. Die SDX AG unterstützt Sie gerne mit Beratung,  Entwicklung und Produktivnahme von Custom Components.