将 ExecutionInstanceGUID 与 SSISDB 相关联

bil*_*nkc 13 ssis sql-server-2012

2012 年发布的 SQL Server 集成服务 SSIS 提供了一个 SSISDB 目录,用于跟踪包的操作(除其他外)。使用项目部署模型的解决方案的默认包执行将打开 SSISDB 的日志记录。

当一个包执行时,System::ExecutionInstanceGUID填充有一个值,如果使用显式日志记录(到sys.sysdtslog90/ sys.sysssislog)将记录特定包执行的所有事件。

我想知道的是,如何将 ExecutionInstanceGUID 绑定到SSISDB 目录中的任何内容。或者,在 SSISDB 中执行的 SSIS 包是否知道其值catalog.executions.execution_id

最终,我尝试使用现有的自定义审计表并将其链接回 SSISDB 目录中的详细历史记录,但似乎找不到链接。

bil*_*nkc 9

我使用由单个包组成的 2012 部署模型创建了一个 SSIS 项目。在那个包中,我添加了一个 OLE DB 连接管理器,将它指向 tempdb 并将一个脚本任务放到画布上。我还使用该 OLE DB 连接管理器打开了显式日志记录并捕获了该OnInformation事件。

带有脚本任务的控制流 - SCR Fire 信息

可控硅火灾信息

我配置我的脚本任务,抢两个参数:System::ExecutionInstanceGUIDSystem::ServerExecutionID我会在这一点上承认,我没有注意到第二个变量,直到玛丽安的回答。在任务中,我引发了 2 个信息事件,以便我可以记录值。这应该记录到显式表 (dbo.sysssislog) 和“免费”日志记录 (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;
    }
Run Code Online (Sandbox Code Playgroud)

部署和执行

然后我将我的项目部署到服务器并执行它。

提示查看操作报告,操作 ID 8

我打开操作报告并单击进入SCR Fire info任务详细信息。

操作详情

红色圈出的项目表明我们正在查看操作 8 的详细信息,正如预期的那样。突出显示的行是使OnInformation这两个系统变量的值冒泡的事件。同样正如预期的那样, 的值System::ServerExecutionID与报告中的值相匹配。的值System::ExecutionInstanceGUID一如既往地毫无意义,但它存在{3F515780-8062-40AA-B9EC-C320CBAC5EFD}。

把这一切捆绑在一起

我现在有两个不同的日志我想绑在一起。

系统日志查询

运行此查询从旧式日志记录表中提取相关行。

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;
Run Code Online (Sandbox Code Playgroud)

结果看起来像

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.
Run Code Online (Sandbox Code Playgroud)

catalog.operation_messages 查询

针对 SSISDB 目录运行此查询显示了上述报告中的所有消息,并确认我可以将值链接messageoperation_id以及结束到dbo.sysssislog.executionid

SELECT 
    OM.* 
FROM 
    catalog.operation_messages AS OM
WHERE
    OM.operation_id = 8;
Run Code Online (Sandbox Code Playgroud)

这些结果是

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
Run Code Online (Sandbox Code Playgroud)

包起来

当包在 SSISDB 目录的上下文之外执行时(又名通过 SSDT-BI 或 .ispac 的命令行), 的值System::ServerExecutionID将为 0。这是有道理的,但未来的读者要么使用 LEFT OUTER JOIN将 sysssislog 链接到 catalog.operation_messages 时,如果要捕获包的所有执行。

帽子提示,我衷心感谢,答案归功于玛丽安让我走上正确的轨道。鉴于在我的汇总日志记录表中存储 GUID(16 字节)和 bigint(8 字节)之间的选择,这对我来说很简单:请单调增加大整数。


Mar*_*ian 5

评论太多了,但尝试一些东西。从该系统表catalog.executions的 msdn 页面我得到:

execution_id - bigint - 执行实例的唯一标识符 (ID)。

从这篇文章 - SSIS 2012 - 查看过去执行的连接管理器信息- 我明白:

SSIS 2012 提供了一个新的系统变量 ServerExecutionID,供您在包内使用,因此如果您执行任何自定义日志记录/通知,它是一个很好的变量,因为它将直接指向我们将用来查找的目录视图连接字符串信息。... Catalog.executions 每次执行包含一行。这是我们将按 execution_id 过滤的地方。

使用以下示例查询:

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;
Run Code Online (Sandbox Code Playgroud)

我在此表中没有看到您的 ExecutionInstanceGUID。不过,我看到的是这个古老的 Connect 项目,其中有以下故事:

SSIS RunningPackage.InstanceID != System::ExecutionInstanceGUID 虽然它们应该相等。

所以我的结论是 ExecutionInstanceGUID 与 execution_id 无关,而是一些 InstanceId 列,以防您在 SSISDB 中有一个。