从非sysadmin域用户拥有的SQL Agent作业中运行SSIS包


15

我有两个SSIS程序包,它们作为大型SSIS部署的一部分,在夜间(通过SQL Server代理)按计划运行,没有任何问题。一切都使用Windows身份验证,并且计划的作业由sysadmin(我,我)拥有,并作为 SQL Server代理服务帐户运行。

因此,数据实际上是source system ~> transit db ~> staging ~> NDS通宵达旦的。

我关心的两个SSIS包分别针对一组特定的数据处理transit db ~> stagingstaging ~> 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用户,我已向其授予executeUpdateMaterialInventory过程的权限。这避免了必须向域用户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]。

看起来代理/凭证的设置方式有些不正确。我哪部分做错了?

Answers:


17

这个问题看起来比实际要复杂。由于您使用的是SQL 2014,您可能会被2012年引入的新安全功能所困扰。

真正重要的是:

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}'.

您的代理用户的登录名很可能无权访问SSISDB目录(即使他可能有权访问SQL Server)。
您需要将登录名映射到SSISDB用户,在Integration Services中配置对SSISDB文件夹/项目的访问。

请查看此MSDN博客文章SSIS目录访问控制技巧SQL 2012 SSIS目录权限

一旦实际加载了程序包,您可能会遇到其他安全上下文问题,但是应该从集成服务本身获得更好的日志记录。


3
就是这个 感谢您超越:-)
Mathieu Guindon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.