【发布时间】: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_execution 和SSISDB.internal.prepare_execution 存储过程中发现了以下代码
EXECUTE AS CALLER
...
REVERT
这导致语句失败,因为它覆盖了试图指定的代理帐户。通过注释掉SSISDB.catalog.start_execution和SSISDB.internal.prepare_execution中的REVERT语句,代码以Proxy账号成功运行。
我并不热衷于绕过开发人员出于某种原因输入的代码的想法,但我需要一种方法来通过存储过程作为代理帐户执行语句,并且这种方法有效。谁能建议使用不引用 REVERT 的 SSISDB.catalog.start_execution 和 SSISDB.internal.prepare_execution 存储过程的替代版本是否会有任何后果?
谢谢,
伊恩
【问题讨论】:
-
您是否在该特定 SQL Server 上运行了 SQL 代理?您可以改为使用作业运行包,这将允许您指定代理帐户,然后使用 sp_start_job 运行作业。
标签: sql-server ssis proxy execution