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 目录中的详细历史记录,但似乎找不到链接。
我使用由单个包组成的 2012 部署模型创建了一个 SSIS 项目。在那个包中,我添加了一个 OLE DB 连接管理器,将它指向 tempdb 并将一个脚本任务放到画布上。我还使用该 OLE DB 连接管理器打开了显式日志记录并捕获了该OnInformation事件。

我配置我的脚本任务,抢两个参数:System::ExecutionInstanceGUID和System::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)
然后我将我的项目部署到服务器并执行它。

我打开操作报告并单击进入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)
针对 SSISDB 目录运行此查询显示了上述报告中的所有消息,并确认我可以将值链接message到operation_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 字节)之间的选择,这对我来说很简单:请单调增加大整数。
评论太多了,但尝试一些东西。从该系统表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 中有一个。
| 归档时间: |
|
| 查看次数: |
12000 次 |
| 最近记录: |