从 SQL Server 服务代理调用 SSIS 与 SSISDB 实现

Posted

技术标签:

【中文标题】从 SQL Server 服务代理调用 SSIS 与 SSISDB 实现【英文标题】:Calling SSIS with SSISDB implementation from SQL Server Service broker 【发布时间】: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 见Service Broker External Activator 代码签名有效吗? msdn.microsoft.com/en-us/library/bb283630.aspx 【参考方案1】:

我认为您可以取出“WITH EXECUTE AS CALLER”,并且所有内容(proc 以及最终被调用的包)都将在 Service Broker 的安全上下文中运行。只要那个上下文有权限做你想做的事,你应该没问题。

我没有以这种方式使用 Service Broker,但我对 SQL 代理触发的作业执行相同的操作。只要代理的安全上下文具有 procs/packages 中所需的权限,一切都运行良好。我们为我们的服务使用网络帐户,因此它也可以在服务器之间运行。

【讨论】:

回答有点晚了,我们实际上已经从 Sql 服务代理中放弃了整个调用 SSIS -> webservice 并使用 SQL CLR 路由。为了确保通话安全,我们禁用匿名通话,并强制 Windows 登录,因为它是 Intranet 站点,而且我们希望每个调用该网站的人都应该登录,这是有效的。但我仍然认为这是微软错失的机会,实际上是从数据库创建一个真正的基于推送事件的系统 作为记录,如果没有 EXECUTE AS 子句,跨数据库模块签名将无法通过服务代理激活过程进行 而 EXECUTE AS CALLER 对此不起作用,它必须是某个特定用户【参考方案2】:

这有一种紧密耦合的代码味道,我的第一直觉是将队列、容纳 proc 的 DB 和 SSIS 执行解耦到 PowerShell 脚本中。让脚本从服务代理获取消息,然后在不同的连接上调用 SSISDB,而不将 [catalog].[create_execution][catalog].[set_execution_parameter_value] 包装在存储过程中。您仍然可以直接从 Agent 运行此脚本。

这种方法在安全上下文方面为您提供了最大的灵活性,如果其中一个组件移动到不同的服务器,如果某些东西在 dev/QA 中命名不同,或者技术发生变化(例如 Azure ServiceBus 而不是 Broker)。您还可以通过日志记录/监控发挥创意。

【讨论】:

以上是关于从 SQL Server 服务代理调用 SSIS 与 SSISDB 实现的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 代理作业和 SSIS 项目

SQL Server 代理作业不执行 SSIS 包权限错误

使用 ssis 包在 SQL Server 代理作业中找不到存储过程错误

对 ETL 的良好 SQL Server 集成服务 (SSIS) 示例/示例的建议?

如何从 SSIS 包中检索 SQL Server 实例名称

从 SSIS 运行 SQL 代理作业