我们要求用户使用代理帐户并引用输入参数来执行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语句,代码可以成功执行为代理帐户。

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

谢谢,

伊恩

最佳答案

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

您需要创建一个具有db_datareader访问SSIS db的凭据。您需要设置一个有权执行Execute Integration Services软件包的代理。

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

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

关于sql-server - 以不同于SSISDB的用户身份执行SSIS包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43192801/

10-16 12:40