加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 从非sysadmin域用户拥有的SQL Agent作业运行SSIS

发布时间:2021-03-13 18:05:43 所属栏目:MsSql教程 来源:网络整理
导读:我有两个SSIS包,它们在一夜之间(通过SQL Server代理)运行,作为更大的SSIS部署的一部分,没有任何问题.一切都在使用 Windows身份验证,并且计划的作业由sysadmin(我,我)拥有,并作为SQL Server代理服务帐户运行. 因此,数据本质上是源系统? transit db~升级? ND

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

因此,数据本质上是源系统?> 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'DOMAINthatperson'
exec NDS.dbo.UpdateMaterialInventory;
go

我得到这个输出:

Job 'NDS-ManualMaterialInventory' started successfully.

然而,工作经历告诉我们一个不那么令人鼓舞的故事:

The job failed.  The Job was invoked by User DOMAINthatperson.
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: SSISDBFooBarfoobar.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].

看起来有关如何设置代理/凭证的问题.我做错了哪一部分?

解决方法

这个问题看起来比现在复杂得多.由于您使用的是SQL 2014,因此您可能会被2012年推出的新安全功能所困扰.

唯一真正重要的是:

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博客文章SSIS Catalog Access Control Tips和SQL 2012 SSIS Catalog Permissions

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

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读