我们要求用户使用代理帐户并引用输入参数来执行 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_execution
and SSISDB.internal.prepare_execution
存储过程
EXECUTE AS CALLER
...
REVERT
这导致该语句失败,因为它覆盖了尝试指定的代理帐户。通过注释掉 REVERT 语句SSISDB.catalog.start_execution
and SSISDB.internal.prepare_execution
,代码以代理帐户成功执行。
我并不热衷于绕过开发人员出于某种原因而放入的代码,但我需要一种方法来通过存储过程作为代理帐户执行该语句,并且此方法有效。任何人都可以建议使用替代版本是否会产生任何后果SSISDB.catalog.start_execution
and SSISDB.internal.prepare_execution
不引用 REVERT 的存储过程?
Thanks,
Ian