以不同于 SSISDB 的用户身份执行 SSIS 包
Executing a SSIS package as different user from SSISDB
我们要求用户使用代理帐户并引用输入参数来执行 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
这导致了以下错误消息:
The current security context cannot be reverted. Please switch to the original database where 'Execute As' was called and try it again.
通过跟踪代码,在 SSISDB.catalog.start_execution
和 SSISDB.internal.prepare_execution
存储过程中找到以下代码
EXECUTE AS CALLER
...
REVERT
这导致语句失败,因为它覆盖了试图指定的代理帐户。通过注释掉 SSISDB.catalog.start_execution
和 SSISDB.internal.prepare_execution
中的 REVERT 语句,代码 运行 通过代理帐户成功执行。
我不喜欢绕过开发人员出于某种原因输入的代码的想法,但我需要一种方法来通过存储过程作为代理帐户来执行语句,并且此方法有效。谁能建议使用不引用 REVERT 的 SSISDB.catalog.start_execution
和 SSISDB.internal.prepare_execution
存储过程的替代版本是否会产生任何后果?
谢谢,
伊恩
要以不同于 SSISDB 的用户身份执行 SSIS 包,您需要利用 SQL 服务器代理的一些功能。
您需要创建一个可以 db_datareader 访问 SSIS 数据库的凭据。您需要设置有权执行集成服务包的代理。
最后,一旦设置了这些先决条件,您就可以创建一个 SQL 服务器代理作业,该作业从 Integration Services Catalog 运行您的 SSIS 包作为您设置的任何代理帐户。
这里有一篇文章更详细地介绍了如何设置我上面描述的内容:https://www.mssqltips.com/sqlservertip/2163/running-a-ssis-package-from-sql-server-agent-using-a-proxy-account/
我们要求用户使用代理帐户并引用输入参数来执行 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
这导致了以下错误消息:
The current security context cannot be reverted. Please switch to the original database where 'Execute As' was called and try it again.
通过跟踪代码,在 SSISDB.catalog.start_execution
和 SSISDB.internal.prepare_execution
存储过程中找到以下代码
EXECUTE AS CALLER
...
REVERT
这导致语句失败,因为它覆盖了试图指定的代理帐户。通过注释掉 SSISDB.catalog.start_execution
和 SSISDB.internal.prepare_execution
中的 REVERT 语句,代码 运行 通过代理帐户成功执行。
我不喜欢绕过开发人员出于某种原因输入的代码的想法,但我需要一种方法来通过存储过程作为代理帐户来执行语句,并且此方法有效。谁能建议使用不引用 REVERT 的 SSISDB.catalog.start_execution
和 SSISDB.internal.prepare_execution
存储过程的替代版本是否会产生任何后果?
谢谢,
伊恩
要以不同于 SSISDB 的用户身份执行 SSIS 包,您需要利用 SQL 服务器代理的一些功能。
您需要创建一个可以 db_datareader 访问 SSIS 数据库的凭据。您需要设置有权执行集成服务包的代理。
最后,一旦设置了这些先决条件,您就可以创建一个 SQL 服务器代理作业,该作业从 Integration Services Catalog 运行您的 SSIS 包作为您设置的任何代理帐户。
这里有一篇文章更详细地介绍了如何设置我上面描述的内容:https://www.mssqltips.com/sqlservertip/2163/running-a-ssis-package-from-sql-server-agent-using-a-proxy-account/