当从 SQL Server 代理程序作业步骤调用 SSIS 包不运行

适用于: SQL Server 2008 DeveloperSQL Server 2008 EnterpriseSQL Server 2008 Standard

症状


从 SQL Server 代理程序作业步骤调用 Microsoft SQL Server 2005年集成服务 (SSI) 包时,将不会运行 SSIS 包。但是,如果不修改 SSIS 包,它将成功运行 SQL Server 代理程序之外。

解决方案


若要解决此问题,请使用下列方法之一:最合适的方法取决于环境和包已失败的原因。包可能失败的原因如下所示:
  • 运行 SQL Server 代理程序下的包所用的用户帐户不同于原始程序包作者。
  • 用户帐户没有所需的权限进行连接或访问 SSIS 包外部的资源。
在下列情况下可能无法运行该程序包:
  • 当前用户无法解密文件包中的秘密。 如果当前帐户或执行帐户不同于原始程序包作者,和包的保护级别属性设置不允许当前用户解密包中的秘密,会发生这种情况。
  • 使用集成的安全性的 SQL Server 连接失败,因为当前用户不具有所需的权限。
  • 文件访问失败,因为当前用户不具有所需的权限写入到连接管理器访问该文件共享。例如,这种情况下可能会发生与文本的日志提供程序不使用登录名和密码。这种情况下也会出现在文件连接管理器,如 SSIS 文件系统任务取决于任何任务。
  • 基于注册表的 SSIS 包配置使用的注册表的注册表项。注册表的注册表项是特定于用户的。
  • 任务或连接管理器需要当前的用户帐户具有正确的权限。
方法 1: 使用 SQL Server 代理程序代理帐户
创建 SQL Server 代理程序代理帐户。此代理帐户必须使用允许 SQL Server 代理程序运行作业以创建包的帐户或具有所需的权限的帐户的凭据。

此方法解密机密信息的工作方式,满足用户的主要要求。但是,此方法可能具有有限的成功因为 SSIS 包用户密钥涉及当前用户和当前计算机。 因此,如果将包移到另一台计算机中,此方法可能仍会失败,即使作业步骤使用正确的代理帐户。


方法 2: 将 SSIS 包的保护级别属性设为 ServerStorage
将 SSIS 包的保护级别属性更改为 ServerStorage。此设置将包存储在一个 SQL Server 数据库,并且可以通过 SQL Server 数据库角色的访问控制。

方法 3: 将 SSIS 包的保护级别属性设为 EncryptSensitiveWithPassword
将 SSIS 包的保护级别属性更改为 EncryptSensitiveWithPassword。此设置用于加密的密码。 然后可以修改 SQL Server 代理程序作业步骤命令行以包括此密码。


方法 4: 使用 SSIS 数据包配置文件
使用 SSIS 数据包配置文件来存储敏感信息,,然后将这些配置文件存储在受保护的文件夹中。 这样包不加密的并不会尝试将密码保存到包,然后可以将保护级别属性更改为 DontSaveSensitive。当您运行的 SSIS 包时,从配置文件加载所需的信息。请确保包含敏感信息的充分保护的配置文件。


方法 5: 创建一个包模板
对于长期的解决方法,创建一个包模板,使用了与默认设置不同的保护级别。此问题不会发生在将来的包。

状态


此行为是设计使然。

高级的信息


重现问题的步骤

  1. 登录的用户身份不是 SQLServer2005SQLAgentUser 组的一部分。例如,您可以创建一个本地用户。
  2. 创建一个 SSIS 包中,然后再添加 ExecuteSQL 任务。使用 OLE DB 连接管理器到本地 msdb 文件中使用下面的字符串: Windows 身份验证 SQLSourceType:"直接输入"则:"sp_who"
  3. 运行包,以确保它成功运行。
  4. 请注意,保护级别属性设置为 EncryptSensitiveWithPassword。
  5. 创建的 SQL Server 代理作业和作业步骤。在运行方式列表中,单击要运行的作业步骤的SQL Server 代理服务
SQL Server 代理作业历史记录中的文本将显示类似于以下内容的信息:

解密包机密

SSIS 包的保护级别属性的默认设置为 EncryptSensitiveWithUserKey。保存包时,SSIS 加密只有部分包包含被标记为"敏感"如密码、 用户名和连接字符串的属性。因此,当包被重新加载,则当前用户必须满足敏感属性要解密的加密要求。但是,当前用户没有以满足加载包的加密要求。通过 SQL Server 代理程序作业步骤运行包时,默认的帐户是 SQL Server 代理服务帐户。此默认帐户很可能是包作者以外的其他用户。因此,SQL Server 代理程序作业步骤可以加载并开始运行的作业步骤,但包将失败,因为它不能完成连接。例如,包无法完成连接到 OLE DB 或 FTP 连接。包失败,因为它不能解密它必须具有连接的凭据。


重要:请考虑开发过程和环境以确定需要和每台计算机上的帐户。EncryptSensitiveWithUserKey 属性设置的保护级别是一个功能强大的设置。因为它会导致最初的部署问题不应扣除此设置。当您登录到相应的帐户,您可以加密包。您可以使用 Dtutil.exe SSIS 命令提示符实用程序使用.cmd 文件和 SQL Server 代理程序命令子系统更改保护级别。例如,请执行以下步骤。因为您可以使用批处理文件和循环中的 Dtutil.exe 实用工具,可以在同一时间按照适合多个包步骤。
  1. 修改您想要使用密码加密的包。
  2. 使用 Dtutil.exe 实用程序通过操作系统 (cmd Exec) SQL Server 代理程序作业步骤的保护级别属性更改为 EncryptSensitiveWithUserKey。此过程涉及到由使用的密码,然后重新加密包解密包。用户密钥用来加密包是在运行方式列表中设置的 SQL Server 代理作业步骤。

    注意:由于键中包含的用户名和计算机名,将包移到另一台计算机的影响可能有限。

请确保您掌握详细有关 SSIS 包失败的错误信息

而不是依赖有限详细信息的 SQL Server 代理作业历史记录中,您可以使用 SSIS 日志记录以确保您具有有关 SSIS 包失败的错误信息。您还可以使用 exec 子系统命令而不是 SSIS 子系统命令运行包。

有关 SSIS 日志记录

SSIS 日志记录和日志提供程序使您可以捕获有关包执行和故障的详细信息。默认情况下,包不记录信息。您必须配置要记录的信息的包。配置要记录的信息的包时,显示类似于以下内容的详细的信息。在这种情况下,您将知道它是权限问题:

出错、 域名、 域名 \ 用户名、 FTP Task,{C73DE41C-D0A6-450A-BB94-DF6D913797A1},{2F0AF5AF-2FFD-4928-88EE-1B58EB431D74},4/28/2006 下午 1:51:59,2006 年 4 月 28 日下午 1:51:59,-1073573489,0 x,无法连接到 FTP 服务器使用"FTP 连接管理器"。

出错、 域名、 域名 \ 用户名,执行 SQL Task,{C6C7286D-57D4-4490-B12D-AC9867AE5762},{F5761A49-F2F9-4575-9E2B-B3D381D6E1F3},4/28/2006 4:07:00 PM,2006 年 4 月 28 日下午 4:07:00,-1073573396,0 x,无法获取连接"user01.msdb"。连接配置不正确,或您可能没有在此连接上的适当权限。

有关执行子系统命令和输出信息

通过使用 exec 子系统命令方法,您可以添加详细控制台登录到 SSIS 命令行调用 Dtexec.exe SSIS 的命令行可执行文件的开关。此外,您将使用的输出文件的高级的作业功能。您可以使用历史记录中包含步骤输出选项将日志记录信息重定向到文件或 SQL Server 代理作业历史记录。

以下是命令行的示例:
 
dtexec.exe /FILE "C:\_work\SSISPackages\ProtectionLevelTest\ProtectionLevelTest\AgentTesting.dtsx" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF  /REPORTING V  /CONSOLELOG NCOSGXMT 


/Console 记录返回类似于以下内容的详细信息:
 
Error: 2006-04-27 18:13:34.76   Code: 0xC0202009   Source: AgentTesting Connection manager "(local).msdb"   Description: An OLE DB error has occurred. Error code: 0x80040E4D.An OLE DB record is available.  Source: "Microsoft SQL Native Client"  Hresult: 0x80040E4D  Description: "Login failed for user 'DOMAINNAME\username'.".End Error 
 
Error: 2006-04-28 13:51:59.19   Code: 0xC0016016   Source:     Description: Failed to decrypt protected XML node "DTS:Property" with error 0x80070002 "The system cannot find the file specified.". You may not be authorized to access this information. This error occurs when there is a cryptographic error. Verify that the correct key is available.End Error 
 
Log:     Name: OnError     Computer: COMPUTERNAME     Operator: DOMAINNAME\username     Source Name: Execute SQL Task     Source GUID: {C6C7286D-57D4-4490-B12D-AC9867AE5762}     Execution GUID: {7AFE3D9E-5F73-42F0-86FE-5EFE264119C8}     Message: Failed to acquire connection "(local).msdb". Connection may not be configured correctly or you may not have the right permissions on this connection.     Start Time: 2006-04-27 18:13:34     End Time: 2006-04-27 18:13:34End Log 

参考资料


有关类似问题的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

904800您可以收到"加载错误"错误消息,当您尝试在 SQL Server 2005 中运行 SQL Server 2005 集成服务包

有关如何在批处理操作中使用 Dtutil.exe 实用程序的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

906562如何使用 dtutil 实用程序 (Dtutil.exe) 在 SQL Server 2005 中设置批处理的 SQL Server Integration Services (SSI) 包的保护级别

有关如何创建包模板的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

908018如何在 SQL Server 商业智能开发 Studio 中创建一个包模板



有关 SSIS 包的安全性和保护级别属性的详细信息,请参阅 SQL Server 2005 联机丛书中的"集成服务的安全考虑因素"主题。

遗憾的是,用户将不知道默认代理程序作业步骤设置在此状态下将。有关 SQL Server 代理程序代理和 SSIS 的详细信息,请参阅 SQL Server 2005 联机丛书中的下列主题:
  • 在 SQL Server 代理程序的调度包执行
  • 创建 SQL Server 代理程序代理服务器