原始 KB 编号:
918760
从SQL Server 代理作业步骤调用 Microsoft SQL Server Integration Services (SSIS) 包时,SSIS 包不会运行。 但是,如果不修改 SSIS 包,它将在SQL Server 代理外部成功运行。
若要解决此问题,请使用以下方法之一。 最合适的方法取决于环境和包失败的原因。 包可能失败的原因如下所示:
用于在SQL Server 代理下运行包的用户帐户与原始包作者不同。
用户帐户没有建立连接或访问 SSIS 包外部资源所需的权限。
在以下方案中,包可能无法运行:
当前用户无法从包解密机密。 如果当前帐户或执行帐户与原始包作者不同,并且包的 ProtectionLevel 属性设置不允许当前用户解密包中的机密,则可能会发生这种情况。
使用集成安全性的SQL Server连接失败,因为当前用户没有所需的权限。
文件访问失败,因为当前用户没有写入连接管理器访问的文件共享所需的权限。 例如,不使用登录名和密码的文本日志提供程序可能会出现这种情况。 此方案还适用于任何依赖于文件连接管理器的任务,例如 SSIS 文件系统任务。
基于注册表的 SSIS 包配置使用
HKEY_CURRENT_USER
注册表项。 注册
HKEY_CURRENT_USER
表项是用户特定的。
任务或连接管理器要求当前用户帐户具有正确的权限。
若要解决此问题,请使用以下方法:
方法 1:使用SQL Server 代理代理帐户。
创建SQL Server 代理代理帐户。 此代理帐户必须使用允许SQL Server 代理作为创建包的帐户或具有所需权限的帐户运行作业的凭据。
此方法可用于解密机密并满足用户的密钥要求。 但是,此方法的成功率可能有限,因为 SSIS 包用户密钥涉及当前用户和当前计算机。 因此,如果将包移到另一台计算机,即使作业步骤使用正确的代理帐户,此方法也可能仍然失败。
方法 2:将 SSIS 包
ProtectionLevel
属性设置为 ServerStorage。
将 SSIS Package ProtectionLevel 属性更改为 ServerStorage。 此设置将包存储在SQL Server数据库中,并允许通过SQL Server数据库角色进行访问控制。
方法 3:将 SSIS 包
ProtectionLevel
属性设置为
EncryptSensitiveWithPassword
。
将 SSIS 包
ProtectionLevel
属性更改为
EncryptSensitiveWithPassword
. 此设置使用密码进行加密。 然后,可以修改SQL Server 代理作业步骤命令行以包含此密码。
方法 4:使用 SSIS 包配置文件。
使用 SSIS 包配置文件存储敏感信息,然后将这些配置文件存储在安全文件夹中。 然后,可以将属性更改
ProtectionLevel
为
DontSaveSensitive
不加密包,并且不会尝试将机密保存到包中。 运行 SSIS 包时,会从配置文件加载所需的信息。 如果配置文件包含敏感信息,请确保它们受到充分保护。
方法 5:创建包模板。
对于长期解析,请创建一个包模板,该模板使用与默认设置不同的保护级别。 此问题不会在将来的包中发生。
重现问题的步骤
以不属于 SQLServerSQLAgentUser 组的用户身份登录。 例如,可以创建本地用户。
创建 SSIS 包,然后添加 ExecuteSQL 任务。 使用以下字符串将 OLE DB 连接管理器用于本地 msdb 文件:
'Windows Authentication' -SQLSourceType: "Direct Input" -SQLStatement: "sp_who"
运行包以确保它成功运行。
ProtectionLevel
属性设置为
EncryptSensitiveWithPassword
。
创建SQL Server 代理作业和作业步骤。 在
“运行方式”
列表中,单击
SQL Server 代理服务
以运行作业步骤。 SQL Server 代理作业历史记录中的文本显示如下所示的信息:
解密包机密
SSIS 包
ProtectionLevel
属性的默认设置是
EncryptSensitiveWithUserKey
。 保存包后,SSIS 仅加密包中包含标记
sensitive
属性的部分,例如密码、用户名和连接字符串。 因此,当重新加载包时,当前用户必须满足要解密的
sensitive
属性的加密要求。 但是,当前用户无需满足加密要求即可加载包。 通过SQL Server 代理作业步骤运行包时,默认帐户是SQL Server 代理服务帐户。 此默认帐户很可能与包作者不同的用户。 因此,SQL Server 代理作业步骤可以加载并开始运行作业步骤,但包因无法完成连接而失败。 例如,包无法完成 OLE DB 连接或 FTP 连接。 包失败,因为它无法解密必须连接的凭据。
考虑开发过程和环境,以确定每台计算机上需要和使用哪些帐户。 属性的 EncryptSensitiveWithUserKey 设置
ProtectionLevel
是一个强大的设置。 不应打折扣此设置,因为它首先会导致部署复杂性。 登录到相应帐户时,可以加密包。 还可以使用 Dtutil.exe SSIS 命令提示符实用工具通过使用 .cmd 文件和SQL Server 代理命令子系统更改保护级别。 例如,请执行以下步骤。 由于可以在批处理文件和循环中使用Dtutil.exe实用工具,因此可以同时针对多个包执行这些步骤。
使用密码修改要加密的包。
通过
操作系统 (cmd Exec) SQL Server 代理
作业步骤使用Dtutil.exe实用工具将属性更改
ProtectionLevel
为
EncryptSensitiveWithUserKey
。 此过程涉及使用密码解密包,然后重新加密包。 用于加密包的用户密钥是
运行方式
列表中的SQL Server 代理作业步骤设置。
由于密钥包含用户名和计算机名称,因此将包移到另一台计算机的效果可能会受到限制。
可以使用 SSIS 日志记录来确保有有关 SSIS 包故障的错误信息,而不是依赖于SQL Server 代理作业历史记录中有限的详细信息。 还可以使用 exec 子系统命令而不是 SSIS 子系统命令来运行包。
关于 SSIS 日志记录
通过 SSIS 日志记录和日志提供程序,可以捕获有关包执行和失败的详细信息。 默认情况下,包不记录信息。 必须将包配置为记录信息。 将包配置为日志信息时,会显示如下所示的详细信息。 在这种情况下,你将知道这是一个权限问题:
OnError,DOMAINNAME,DOMAINNAME\USERNAME,FTP Task,{C73DE41C-D0A6-450A-BB94-DF6D913797A1},{2F0AF5AF-2FFD-4928-88EE-1B58EB431D74},4/28/2006 1:51:59 PM,4/28/2006 1:51:59 PM,-1073573489,0x,Unable to connect to FTP server using "FTP Connection Manager".
OnError,DOMAINNAME,DOMAINNAME\USERNAME,Execute SQL Task,{C6C7286D-57D4-4490-B12D-AC9867AE5762},{F5761A49-F2F9-4575-9E2B-B3D381D6E1F3},4/28/2006 4:07:00 PM,4/28/2006 4:07:00 PM,-1073573396,0x,Failed to acquire connection "user01.msdb". Connection may not be configured correctly or you may not have the right permissions on this connection.
通过使用 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
控制台日志记录返回类似于以下内容的详细信息:
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:34 End Log
有关类似问题的详细信息,请参阅在 2005 SQL Server尝试运行 SQL Server 2005 Integration Services 包时收到“加载错误”错误消息
有关如何在批处理操作中使用Dtutil.exe实用工具的详细信息,请参阅如何使用 dtutil 实用工具 (Dtutil.exe) 在 2005 SQL Server中设置一批SQL Server Integration Services (SSIS) 包的保护级别
有关如何创建包模板的详细信息,请参阅如何在 SQL Server Business Intelligence Development Studio 中创建包模板
有关 SSIS 包安全和属性的ProtectionLevel
详细信息,请参阅 SQL Server 2005 联机丛书中的 Integration Services 安全注意事项主题。
遗憾的是,用户并不知道默认代理作业步骤设置会将其置于此状态。 有关SQL Server 代理代理和 SSIS 的详细信息,请参阅 SQL Server 2005 联机丛书中的以下主题:
在SQL Server 代理中计划包执行
创建SQL Server 代理代理