以与 SSISDB 不同的用户身份执行 SSIS 包

Posted

技术标签:

【中文标题】以与 SSISDB 不同的用户身份执行 SSIS 包【英文标题】:Executing a SSIS package as different user from SSISDB 【发布时间】:2017-04-03 19:29:52 【问题描述】:

我们要求用户使用代理帐户并引用输入参数来执行 SSIS 包。

以下演示了用于调用包执行的语法...

DECLARE @ExportID INT = 1;
DECLARE @ExecutionID INT;

EXECUTE AS [proxy_account]  

EXEC [SSISDB].[catalog].[create_execution]
    @folder_name = 'DW',  
    @project_name = 'DW_ETL',  
    @reference_id = NULL,  
    @use32bitruntime = 1,  
    @execution_id = @ExecutionID OUTPUT;

EXEC [SSISDB].[catalog].[set_execution_parameter_value]  
    @execution_id = @ExecutionID,  
    @object_type = 30,  
    @parameter_name = 'ExportID',  
    @parameter_value = @ExportID;

EXEC [SSISDB].[catalog].[start_execution]  
    @execution_id = @ExecutionID;

REVERT

这导致以下错误消息:

当前的安全上下文无法恢复。请切换到调用“执行为”的原始数据库,然后重试。

通过跟踪代码,在SSISDB.catalog.start_executionSSISDB.internal.prepare_execution 存储过程中发现了以下代码

EXECUTE AS CALLER
...  
REVERT

这导致语句失败,因为它覆盖了试图指定的代理帐户。通过注释掉SSISDB.catalog.start_executionSSISDB.internal.prepare_execution中的REVERT语句,代码以Proxy账号成功运行。

我并不热衷于绕过开发人员出于某种原因输入的代码的想法,但我需要一种方法来通过存储过程作为代理帐户执行语句,并且这种方法有效。谁能建议使用不引用 REVERT 的 SSISDB.catalog.start_executionSSISDB.internal.prepare_execution 存储过程的替代版本是否会有任何后果?

谢谢,

伊恩

【问题讨论】:

您是否在该特定 SQL Server 上运行了 SQL 代理?您可以改为使用作业运行包,这将允许您指定代理帐户,然后使用 sp_start_job 运行作业。 【参考方案1】:

要以与 SSISDB 不同的用户身份执行 SSIS 包,您需要利用 SQL Server 代理的一些功能。

您需要创建一个对 SSIS 数据库具有 db_datareader 访问权限的凭据。您需要设置一个有权执行集成服务包的代理。

最后,一旦您设置了这些先决条件,您就可以创建一个 SQL Server 代理作业,以您设置的任何代理帐户从 Integration Services 目录运行您的 SSIS 包。

这里有一篇文章提供了关于如何设置我上面描述的更详细的方法:https://www.mssqltips.com/sqlservertip/2163/running-a-ssis-package-from-sql-server-agent-using-a-proxy-account/

【讨论】:

我已将凭据、代理、作业步骤配置为以代理用户身份运行。运行作业时出现“意外终止”错误。假设我将凭据用户添加到计算机的管理员组,然后它可以正常工作。知道凭据用户所需的最低权限是多少吗? @variable 您是否在服务器和 db_datareader 上提供了登录 SSISDB 数据库的凭据?我猜当您将凭据帐户添加到管理员组时它会起作用,因为管理员组是使用 sysadmin 服务器角色设置的? 我已经在服务器上提供了凭据登录。并添加了对 ssis 包文件夹属性的读取/执行权限。 SSISDB 数据库上没有 db_datareader。我现在已授予此权限,但同样的问题仍然存在。我认为当权限已经在 ssis 目录文件夹级别分配时,无需授予此权限。 @variable 除了创建凭证之外,还要为凭证中使用的同一帐户创建一个实际登录名/用户。创建用户时,在用户映射选项卡上将 db_datareader 提供给 SSISDB。您可能还需要为该帐户提供一个角色 ssis_admin。 它看起来更像是文件系统错误 - 我在这里有详细说明:***.com/questions/66954755/…

以上是关于以与 SSISDB 不同的用户身份执行 SSIS 包的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL Server 服务代理调用 SSIS 与 SSISDB 实现

SSISDB5:Parameter

sql SQL查询SSISDB以查找与特定SSIS包相关的错误消息

SSISDB5:使用TSQL脚本执行Package

通过SSIS将文件导出到sharepoint(UNC) - 拒绝访问

SSISDB 和永远在线。如何安排工作?