Relacionar ExecutionInstanceGUID con SSISDB

13

La versión 2012 de SQL Server Integration Services, SSIS, ha entregado un catálogo SSISDB que rastrea las operaciones de los paquetes (entre otras cosas). La ejecución del paquete predeterminado para las soluciones que utilizan el modelo de Implementación del proyecto tendrá activado el inicio de sesión en SSISDB.

Cuando se ejecuta un paquete, System::ExecutionInstanceGUIDse rellena con un valor que, si se estuviera utilizando el registro explícito (a sys.sysdtslog90/ sys.sysssislog), se registrarían todos los eventos para una ejecución específica del paquete.

Lo que me gustaría saber es cómo puedo vincular un ExecutionInstanceGUID a cualquier cosa del catálogo SSISDB. Alternativamente, se está ejecutando un paquete SSIS en el SSISDB al tanto del valor de sucatalog.executions.execution_id

Finalmente, estoy tratando de usar la tabla de auditoría personalizada existente y vincularla al historial detallado en el catálogo de SSISDB, pero parece que no puedo encontrar el enlace.

billinkc
fuente

Respuestas:

5

Demasiado para un comentario, pero intentando algo. De la página msdn de esa tabla del sistema catalog.executions obtengo:

execute_id - bigint - El identificador único (ID) para la instancia de ejecución.

De este artículo - SSIS 2012 - Ver información de Connection Manager para ejecuciones pasadas - Entiendo que:

SSIS 2012 proporciona una nueva variable del sistema, ServerExecutionID, para su uso dentro de los paquetes, por lo que si realiza algún registro / notificación personalizado, es una buena variable para incluir, ya que será un puntero directo a las vistas de catálogo que usaremos para encontrar información de la cadena de conexión. ... Catalog.executions contiene una fila por ejecución. Aquí es donde filtraremos por execute_id.

Con una consulta de muestra de:

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;

Lo que no veo es su ExecutionInstanceGUID en esta tabla. Sin embargo, lo que veo es este antiguo elemento de Connect donde está la siguiente historia:

SSIS RunningPackage.InstanceID! = System :: ExecutionInstanceGUID aunque deberían ser iguales.

Entonces, mi conclusión es que ExecutionInstanceGUID no está relacionado con execute_id, sino en una columna InstanceId, en caso de que pueda tener uno en SSISDB.

Mariano
fuente
9

Creé un proyecto SSIS utilizando el Modelo de implementación 2012 que consta de un solo paquete. En ese paquete, agregué un Administrador de conexión OLE DB, lo apunté a tempdb y solté una Tarea de script en el lienzo. También activé el registro explícito usando ese Administrador de conexión OLE DB y capturé el OnInformationevento.

Control de flujo con tarea de script: información de SCR Fire

SCR Fire info

He configurado mi tarea secuencia de comandos para agarrar dos parámetros: System::ExecutionInstanceGUIDy System::ServerExecutionIDtengo que admitir en este punto, que había no notado la segunda variable hasta que la respuesta de Marian. Dentro de la tarea, levanto 2 eventos de información para poder registrar los valores. Esto debe registrarse tanto en la tabla explícita (dbo.sysssislog) como en el registro "libre" (catalog.operation_messages).

    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;
    }

Implementar y ejecutar

Luego desplegué mi proyecto en un servidor y lo ejecuté.

Solicitud para ver el informe de operaciones, id. De operación 8

Abrí el Informe de operaciones e hice clic en los SCR Fire infodetalles de la tarea.

Detalles de la operación

El elemento con un círculo rojo muestra que estamos viendo detalles para la Operación 8, como se esperaba. Las líneas resaltadas son los OnInformationeventos que aumentaron los valores de esas dos variables del sistema. También como se esperaba, el valor de System::ServerExecutionIDcoincide con lo que estaba en el informe. El valor de no System::ExecutionInstanceGUIDtenía sentido como siempre, pero estaba presente {3F515780-8062-40AA-B9EC-C320CBAC5EFD}.

Atar todo junto

Ahora tenía dos registros diferentes que quería unir.

consulta sysssislog

La ejecución de esta consulta retiró las filas relevantes de la tabla de registro de la vieja escuela.

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;

Los resultados parecían

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.

consulta catalog.operation_messages

La ejecución de esta consulta en el catálogo de SSISDB mostró todos los mensajes que estaban en el informe anterior y también confirmó que pudiera vincular el valor de messagea operation_id, así como adbo.sysssislog.executionid

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

Esos resultados fueron

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

Envolver

Cuando el paquete se ejecuta fuera del contexto del catálogo SSISDB (también conocido a través de SSDT-BI o la línea de comando a un .ispac), el valor de the System::ServerExecutionIDserá 0. Tiene sentido, pero los futuros lectores usan una IZQUIERDA EXTERIOR IZQUIERDA al vincular sysssislog a catalog.operation_messages si desea capturar todas las ejecuciones del paquete.

Un consejo, mi sincero agradecimiento y el crédito de respuesta a Marian por ponerme en el camino correcto. Dada la opción entre almacenar un GUID (16 bytes) y un bigint (8 bytes) en mi tabla de registro resumida, no es una obviedad para mí: un número entero grande y monótonamente creciente, por favor.

billinkc
fuente