提问人:Sukanta 提问时间:3/22/2016 最后编辑:marc_sSukanta 更新时间:9/27/2019 访问量:1326
从 SQL Server Service Broker 使用 SSISDB 实现调用 SSIS
Calling SSIS with SSISDB implementation from SQL Server Service broker
问:
要求是通过 SSIS 调用 Web 服务,并从 SQL Server Service Broker 激活的存储过程调用 SSIS。
这是我目前正在做的事情:
队列
CREATE QUEUE [schema].[ProccessingQueue] WITH STATUS = ON , RETENTION = OFF , ACTIVATION ( STATUS = ON , PROCEDURE_NAME = [schema].[usp_ProccessingQueueActivation] , MAX_QUEUE_READERS = 10 , EXECUTE AS N'dbo' ), POISON_MESSAGE_HANDLING (STATUS = ON)
我的存储过程:
ALTER PROCEDURE [schema].[usp_ProccessingQueueActivation]
WITH EXECUTE AS CALLER
AS
BEGIN
SET NOCOUNT ON;
<snip declaration>
BEGIN
BEGIN TRANSACTION;
WAITFOR
(
RECEIVE TOP (1)
@ConversationHandle = conversation_handle,
@MessageBody = CAST(message_body AS XML),
@MessageTypeName = message_type_name
FROM [schema].[ProccessingQueue]
), TIMEOUT 5000;
<snip awasome stuff>
EXEC dbo.RunSSIS <param>
DECLARE @ReplyMessageBody XML = @MessageBody;
SEND ON CONVERSATION @ConversationHandle MESSAGE TYPE [type] (@ReplyMessageBody);
END
<handle error>
COMMIT TRANSACTION;
END
END
现在,RunSSIS 存储过程如下所示
ALTER PROCEDURE [dbo].[RunSSIS]
<params>
AS
BEGIN
DECLARE @exec_id BIGINT
EXEC [SSISDB].[catalog].[create_execution]
@package_name=N'<SSIS_package>',
@folder_name=N'<folder>',
@project_name=N'<projectName>',
@use32bitruntime=FALSE,
@reference_id=NULL,
@execution_id=@exec_id OUTPUT
EXEC [SSISDB].[catalog].[set_execution_parameter_value]
@exec_id,
@object_type=30,
@parameter_name=N'<param_Name>',
@parameter_value=<param>
SELECT @exec_id
EXEC [SSISDB].[catalog].[start_execution] @exec_id
END
现在,这将在事件查看器中引发以下异常,因为在 SSISDB 环境中无法识别 Sql Service Broker 激活安全上下文。
激活的进程 '[架构]。[usp_ProccessingQueueActivation]' 运行 queue '' 输出 following: '当前安全上下文无法还原。请 切换到调用“Execute As”的原始数据库,然后尝试 又是一次。
为了解决这个问题,我尝试了以下方法
因此,我 http://www.databasejournal.com/features/mssql/article.php/3800181/Security-Context-of-Service-Broker-Internal-Activation.htm 点击此链接并创建了一个具有自签名证书的用户(认为它 是没有权限的用户)。但它返回相同的错误, 深入挖掘,我发现[内部]。prepare_execution] 在 SSISDB 在第 36 行中有“REVERT”语句,该语句引发错误 它根本不喜欢冒充。
- 我试图将RunSSIS存储过程移动到SSISDB并尝试从激活存储过程调用它,它被击落为SSISDB,它不允许任何具有SQL Server身份验证的用户,它需要具有Windows身份验证,并且由Certificate创建的用户显然没有Windows凭据。
我的问题是
- 我走在正确的道路上吗?我当然不希望同时使用 SQL Server 的 2 个组件会那么困难。
- 如果方法不正确,从 Service broker 调用服务的最佳方法是什么?我已经看过 SQL Server Service Broker 的“外部激活”,但尚未探索。但是我会尝试坚持使用存在于服务器环境中且可扩展的东西,并且不喜欢在生产环境中安装不同组件的想法(对于支持人员来说,这始终是一个开销,因为还有一点可能会失败)
我正在使用 Windows 身份验证,并且我的凭据具有sys_Admin访问权限。
答:
我认为您可以取出“WITH EXECUTE AS CALLER”,所有内容(过程,然后是最终被调用的包)都将在 Service Broker 的安全上下文下运行。只要该上下文具有执行您想执行的操作的权限,您就应该没问题。
我没有以这种方式使用 Service Broker,但我对 SQL 代理触发的作业执行相同的操作。只要代理的安全上下文具有过程/包中所需的权限,一切就运行良好。我们使用网络帐户进行服务,因此服务器之间也同样有效。
评论
这有一种紧密耦合的代码味道,我的第一反应是将队列、容纳过程的数据库和 SSIS 执行解耦到 PowerShell 脚本中。让脚本从 Service Broker 获取消息,然后在不同的连接上调用 SSISDB,而无需包装并在存储的进程中调用 SSISDB。您仍然可以直接从代理运行此脚本。[catalog].[create_execution]
[catalog].[set_execution_parameter_value]
如果其中一个组件移动到不同的服务器,如果开发/QA 中的某个名称不同,或者技术发生变化(例如,Azure ServiceBus 而不是 Broker),则此方法在安全上下文方面提供了最大的灵活性。您还可以在日志记录/监控方面发挥创意。
评论