因此,数据本质上是源系统〜> transit db~>升级〜> NDS一夜之间.
我关心的两个SSIS包,处理传输db~>分期和分期〜> NDS部分分别用于特定的一组数据.
域用户(非sysadmin)在源系统中执行某些操作并将有趣的数据推送到传输数据库中,因此我需要一种方法在工作时间内获取此更新的数据以更新NDS:确定最简单的方法此人触发该ETL,是通过单击启用宏的Excel工作簿中的按钮,该按钮通过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用户,我向此UpdateMaterialInventory过程授予了执行权限.这避免了必须向域用户授予对msdb.dbo.sp_start_job的执行权限,这将是过多的.
sql代理作业NDS-ManualMaterialInventory由域用户拥有,并且有两个步骤,每个步骤类型为[sql Server Integration Services Package],设置为Run as SSISProxy.
SSISProxy是一个sql Server代理代理,使用凭据名称SSISProxyCredentials映射到[sql Server Integration Services Package]子系统.域用户的登录名已添加到代理帐户主体.
SSISProxyCredentials是使用同一个域用户的标识创建的,该用户在一夜之间运行整个SSIS ETL,并且其密码被四重检查.
现在,如果我运行这个:
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代理服务帐户,则作业将运行,成功并将1,067行记录到[元数据].[dbo].[sysssislog].
看起来有关如何设置代理/凭证的问题.我做错了哪一部分?
解决方法
唯一真正重要的是:
Server: {server name},Environment reference Id: NULL. Description: Login Failed for user '{domain user that runs SSIS ETL overnight}'.
您的代理用户的登录很可能无法访问SSISDB目录(即使他可能有权访问sql Server).
您需要将登录映射到SSISDB用户,并配置对Integration Services中SSISDB文件夹/项目的访问.
请查看此MSDN博客文章@L_502_1@和SQL 2012 SSIS Catalog Permissions
一旦您实际加载了包,您可能会遇到其他安全上下文问题,但您应该从集成服务本身获得更好的日志记录.