我有两个SSIS程序包,它们作为大型SSIS部署的一部分,在夜间(通过SQL Server代理)按计划运行,没有任何问题。一切都使用Windows身份验证,并且计划的作业由sysadmin(我,我)拥有,并作为 SQL Server代理服务帐户运行。
因此,数据实际上是source system ~> transit db ~> staging ~> NDS
通宵达旦的。
我关心的两个SSIS包分别针对一组特定的数据处理transit db ~> staging
和staging ~> NDS
部分。
域用户(非sysadmin)在中执行某项操作source system
,并将感兴趣的数据推入transit db
,因此我需要一种在工作时间内获取此更新数据以更新的方法NDS
:决定了此人触发的最简单方法通过单击已启用宏的Excel工作簿中的按钮来表示该ETL,该工作簿通过ODBC(使用Windows身份验证)连接到SQL Server并执行存储过程。
存储过程如下所示:
create procedure dbo.UpdateMaterialInventory
as
begin
execute msdb.dbo.UpdateMaterialInventory;
end
[msdb]中的“姐妹”存储过程如下所示:
create procedure dbo.UpdateMaterialInventory
with execute as 'SqlAgentProxy'
as
begin
execute msdb.dbo.sp_start_job N'NDS-ManualMaterialInventory';
end
此[SqlAgentProxy]用户是我在域用户登录名[msdb]中创建的Windows用户,我已向其授予execute
此UpdateMaterialInventory
过程的权限。这避免了必须向域用户execute
授予msdb.dbo.sp_start_job
过多的权限。
SQL Agent作业NDS-ManualMaterialInventory
由域用户拥有,并具有2个步骤,每个步骤的类型为[SQL Server Integration Services程序包],设置为“运行方式” SSISProxy
。
SSISProxy
是一个SQL Server Agent代理,它使用凭据名称映射到[SQL Server Integration Services程序包]子系统SSISProxyCredentials
。域用户的登录名已添加到代理帐户主体中。
该SSISProxyCredentials
用创建的身份是隔夜运行整个ETL SSIS相同的域用户的,它的密码是四倍检查。
现在,如果我运行此命令:
execute as login=N'DOMAIN\thatperson'
exec NDS.dbo.UpdateMaterialInventory;
go
我得到以下输出:
Job 'NDS-ManualMaterialInventory' started successfully.
然而,工作经历告诉我们的故事并不那么令人鼓舞:
The job failed. The Job was invoked by User DOMAIN\thatperson.
The last step to run was step 1 (Extract).
而第1步的详细信息:
Executed as user: {domain user that runs SSIS ETL overnight}.
Microsoft (R) SQL Server Execute Package Utility Version 12.0.4100.1 for 64-bit
Copyright (C) Microsoft Corporation. All rights reserved.
Started: 2:18:50 PM Failed to execute IS server package because of error 0x80131904.
Server: {server name}, Package path: \SSISDB\Foo\Bar\foobar.dtsx, Environment reference Id: NULL.
Description: Login failed for user '{domain user that runs SSIS ETL overnight}'.
Source: .Net SqlClient Data Provider
Started: 2:18:50 PM Finished: 2:18:51 PM Elapsed: 0.094 seconds.
The package execution failed.
The step failed.
作业失败,并且任何地方都未记录任何内容。
如果我将作业所有者更改为我自己,并将步骤的运行方式更改为 SQL Server代理服务帐户,则该作业将运行,成功并将1067行记录到[Metadata]。[dbo]。[sysssislog]。
看起来代理/凭证的设置方式有些不正确。我哪部分做错了?