【发布时间】:2016-07-08 15:21:36
【问题描述】:
要求是通过 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 服务代理激活安全上下文。
激活的过程 '[schema].[usp_ProccessingQueueActivation]' 正在运行 队列''输出 以下:'当前的安全上下文无法恢复。请 切换到调用“执行为”的原始数据库并尝试 再来一次。'
为了解决这个问题,我尝试了以下方法
-
所以我点击这个链接 http://www.databasejournal.com/features/mssql/article.php/3800181/Security-Context-of-Service-Broker-Internal-Activation.htm 并创建了一个具有自签名证书的用户(认为它 是没有权限的用户)。但它返回相同的错误, 深入挖掘我发现 [internal].[prepare_execution] 在 SSISDB 在第 36 行有“REVERT”语句,该语句将错误抛出为 它根本不喜欢模仿。
- 我试图将 RunSSIS 存储过程移动到 SSISDB 并尝试从激活存储过程中调用它,它被击落为 SSISDB 它不允许任何具有 SQL Server 身份验证的用户,它需要有一个 Windows 身份验证和用户由 Certificate 创建的显然没有 Windows 凭据。
我的问题是
- 我在正确的道路上吗?我当然没想到一起使用 SQL Server 的 2 个组件会那么困难。
- 如果方法不正确,从服务代理调用服务的最佳方法是什么?我已经看到 SQL Server 服务代理的“外部激活”,但还没有探索过。但是我会尝试坚持一些生活在服务器环境中并且可以扩展的东西,并且不喜欢在产品环境中安装不同组件的想法(这对于支持个人来说总是一种开销,因为还有一点可以失败)
我正在使用 Windows 身份验证,并且我的凭据具有 sys_Admin 访问权限。
【问题讨论】:
-
这看起来更适合dba.stackexchange.com
标签: sql-server ssis service-broker