Verknüpfen der ExecutionInstanceGUID mit der SSISDB


13

Mit der Version 2012 von SQL Server Integration Services, SSIS, wurde ein SSISDB-Katalog bereitgestellt, in dem (unter anderem) die Vorgänge von Paketen nachverfolgt werden. Bei der Standardpaketausführung für Lösungen, die das Project Deployment-Modell verwenden, ist die Protokollierung in der SSISDB aktiviert.

Wenn ein Paket ausgeführt wird, wird das System::ExecutionInstanceGUIDmit einem Wert gefüllt, der bei Verwendung der expliziten Protokollierung (zu sys.sysdtslog90/ sys.sysssislog) alle Ereignisse für eine bestimmte Paketausführung aufzeichnet.

Was ich wissen möchte, ist, wie ich eine ExecutionInstanceGUID an irgendetwas im SSISDB-Katalog binde. Alternativ kann ein SSIS-Paket, das in der SSISDB-Berechtigung ausgeführt wird, den Wert von its annehmencatalog.executions.execution_id

Letztendlich versuche ich, die vorhandene, benutzerdefinierte Prüftabelle zu verwenden und sie mit dem detaillierten Verlauf im SSISDB-Katalog zu verknüpfen, kann den Link jedoch nicht finden.

Antworten:


5

Zu viel für einen Kommentar, aber versuchen Sie etwas. Von der msdn-Seite dieser Systemtabelle catalog.executions erhalte ich:

execution_id - bigint - Die eindeutige Kennung (ID) für die Ausführungsinstanz.

Aus diesem Artikel - SSIS 2012 - Anzeigen von Verbindungs-Manager-Informationen für frühere Ausführungen - Ich verstehe Folgendes:

In SSIS 2012 gibt es eine neue Systemvariable, ServerExecutionID, die Sie in Paketen verwenden können. Wenn Sie also benutzerdefinierte Protokollierungen / Benachrichtigungen durchführen, sollten Sie diese Variable einbeziehen, da sie einen direkten Verweis auf die Katalogansichten darstellt, nach denen wir suchen Informationen zur Verbindungszeichenfolge. ... Catalog.executions enthält eine Zeile pro Ausführung. Hier filtern wir nach execution_id.

Mit einer Beispielabfrage von:

DECLARE @execution_id BIGINT = 41753; -- Your execution_id/ServerExecutionID goes here.
SELECT e.package_name,
        e.start_time,
        e.end_time,
        e.status,
        emc.package_path,
        CAST(emc.property_value AS VARCHAR(1000)) AS connection_string
   FROM catalog.executions e
   JOIN catalog.event_messages em
     ON e.execution_id = em.operation_id
   JOIN catalog.event_message_context AS emc WITH (FORCESEEK)
     ON em.event_message_id = emc.event_message_id
    AND emc.property_name = 'ConnectionString'
    AND emc.context_type = 80 -- Connection Managers
  WHERE e.execution_id = @execution_id;

Was ich nicht sehe, ist Ihre ExecutionInstanceGUID in dieser Tabelle. Was ich jedoch sehe, ist dieses alte Connect-Objekt, in dem es die folgende Geschichte gibt:

SSIS RunningPackage.InstanceID! = System :: ExecutionInstanceGUID, obwohl sie gleich sein sollten.

Mein Fazit ist also, dass ExecutionInstanceGUID nicht mit execution_id zusammenhängt, sondern mit einer InstanceId-Spalte, falls Sie eine in der SSISDB haben.


9

Ich habe ein SSIS-Projekt mit dem Bereitstellungsmodell 2012 erstellt, das aus einem einzelnen Paket besteht. In diesem Paket habe ich einen OLE DB-Verbindungs-Manager hinzugefügt, auf tempdb verwiesen und eine Skriptaufgabe auf der Zeichenfläche abgelegt. Ich habe auch die explizite Protokollierung mit diesem OLE DB-Verbindungs-Manager aktiviert und das OnInformationEreignis aufgezeichnet.

Kontrollieren Sie den Ablauf mit der Skriptaufgabe - SCR Fire info

SCR-Brandinfo

Ich baue meine Skript Aufgabe zu greifen zwei Parameter: System::ExecutionInstanceGUIDund System::ServerExecutionIDich werde an dieser Stelle zugeben, ich hatte nicht die zweite Variable bis Marian Antwort bemerkt. Innerhalb der Aufgabe löse ich 2 Informationsereignisse aus, damit ich die Werte aufzeichnen kann. Dies sollte sowohl in der expliziten Tabelle (dbo.sysssislog) als auch in der "freien" Protokollierung (catalog.operation_messages) protokolliert werden.

    public void Main()
    {
        bool fireAgain = true;
        string description = string.Empty;
        string variable = string.Empty;
        string value = string.Empty;

        variable = "System::ServerExecutionID";
        value = Dts.Variables[variable].Value.ToString();
        description = string.Format("{0}: {1}", variable, value);
        Dts.Events.FireInformation(0, "Reporting", description, string.Empty, 0, ref fireAgain);

        variable = "System::ExecutionInstanceGUID";
        value = Dts.Variables[variable].Value.ToString();
        description = string.Format("{0}: {1}", variable, value);
        Dts.Events.FireInformation(0, "Reporting", description, string.Empty, 0, ref fireAgain);

        Dts.TaskResult = (int)ScriptResults.Success;
    }

Bereitstellen und ausführen

Ich habe dann mein Projekt auf einem Server bereitgestellt und ausgeführt.

Aufforderung zum Anzeigen des Betriebsberichts, Betriebs-ID 8

Ich öffnete den Betriebsbericht und klickte auf die SCR Fire infoAufgabendetails.

Betriebsdetails

Das rot eingekreiste Element zeigt an, dass wir erwartungsgemäß Details für Operation 8 anzeigen. Die hervorgehobenen Linien sind die OnInformationEreignisse, die die Werte dieser beiden Systemvariablen in die Luft gesprudelt haben. Auch der Wert System::ServerExecutionIDstimmte erwartungsgemäß mit dem im Bericht überein. Der Wert von System::ExecutionInstanceGUIDwar wie immer bedeutungslos, aber vorhanden {3F515780-8062-40AA-B9EC-C320CBAC5EFD}.

Alles zusammenbinden

Ich hatte jetzt zwei verschiedene Protokolle, die ich zusammenbinden wollte.

Sysssislog-Abfrage

Durch Ausführen dieser Abfrage wurden relevante Zeilen aus der Protokollierungstabelle der alten Schule zurückgezogen.

SELECT
    L.event
,   L.source
,   L.message 
FROM
    dbo.sysssislog AS L
WHERE
    L.executionid = '{3F515780-8062-40AA-B9EC-C320CBAC5EFD}'
ORDER BY
    L.id ASC;

Die Ergebnisse sahen so aus

event   source  message
PackageStart    ParameterTest   Beginning of package execution.

OnInformation   SCR Fire info   System::ServerExecutionID: 8
OnInformation   ParameterTest   System::ServerExecutionID: 8
OnInformation   SCR Fire info   System::ExecutionInstanceGUID: {3F515780-8062-40AA-B9EC-C320CBAC5EFD}
OnInformation   ParameterTest   System::ExecutionInstanceGUID: {3F515780-8062-40AA-B9EC-C320CBAC5EFD}
PackageEnd  ParameterTest   End of package execution.

Abfrage catalog.operation_messages

Wenn Sie diese Abfrage für den SSISDB-Katalog ausführen, werden alle Nachrichten angezeigt, die im obigen Bericht enthalten sind, und es wird bestätigt, dass der Wert sowohl messagemit operation_idals auch mit verknüpft werden kanndbo.sysssislog.executionid

SELECT 
    OM.* 
FROM 
    catalog.operation_messages AS OM
WHERE
    OM.operation_id = 8;

Diese Ergebnisse waren

operation_message_id    operation_id    message_time    message_type    message_source_type message extended_info_id
30  8   2013-04-02 21:02:34.1418917 -05:00  10  30  ParameterTest:Validation has started.   NULL
31  8   2013-04-02 21:02:34.1738922 -05:00  10  40  SCR Fire info:Validation has started.   NULL
32  8   2013-04-02 21:02:34.1768872 -05:00  20  40  SCR Fire info:Validation is complete.   NULL
33  8   2013-04-02 21:02:34.1788903 -05:00  20  30  ParameterTest:Validation is complete.   NULL
34  8   2013-04-02 21:02:34.3349188 -05:00  30  30  ParameterTest:Start, 9:02:34 PM.    NULL
35  8   2013-04-02 21:02:34.4009253 -05:00  30  40  SCR Fire info:Start, 9:02:34 PM.    NULL
36  8   2013-04-02 21:02:34.4009253 -05:00  10  40  SCR Fire info:Validation has started.   NULL
37  8   2013-04-02 21:02:34.4019251 -05:00  20  40  SCR Fire info:Validation is complete.   NULL
38  8   2013-04-02 21:02:34.4219283 -05:00  70  40  SCR Fire info:Information: System::ServerExecutionID: 8 NULL
39  8   2013-04-02 21:02:34.4259295 -05:00  70  40  SCR Fire info:Information: System::ExecutionInstanceGUID: {3F515780-8062-40AA-B9EC-C320CBAC5EFD}    NULL
40  8   2013-04-02 21:02:34.4409316 -05:00  40  40  SCR Fire info:Finished, 9:02:34 PM, Elapsed time: 00:00:00.031. NULL
41  8   2013-04-02 21:02:34.4419388 -05:00  40  30  ParameterTest:Finished, 9:02:34 PM, Elapsed time: 00:00:00.125. NULL

Einpacken

Wenn das Paket außerhalb des Kontexts des SSISDB-Katalogs ausgeführt wird (auch bekannt als über SSDT-BI oder die Befehlszeile zu einem .ispac), ist der Wert von the System::ServerExecutionID0. Es ist sinnvoll, aber zukünftige Leser verwenden entweder LEFT OUTER JOIN Wenn Sie sysssislog mit catalog.operation_messages verknüpfen, um alle Ausführungen des Pakets abzufangen .

Der Hut, mein herzlicher Dank und die Antwort gehen an Marian, der mich auf den richtigen Weg gebracht hat. Angesichts der Wahl zwischen der Speicherung einer GUID (16 Byte) und einer Bigint (8 Byte) in meiner zusammengefassten Protokollierungstabelle ist es für mich ein Kinderspiel: Bitte erhöhen Sie die Big Integer-Zahl monoton.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.