Вызов SSIS с реализацией SSISDB от брокера службы SQL Server

Требование - вызвать веб-службу через SSIS и вызвать SSIS из активированной хранимой процедуры Service Broker службы SQL Server.

Вот что я сейчас делаю:

Очередь

   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,             
    @[email protected]_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

Теперь это вызовет исключение ниже в средстве просмотра событий, поскольку контекст безопасности активации брокерской службы Sql не распознается в среде SSISDB.

Активированный proc '[схема]. [usp_ProccessingQueueActivation]' работает queue '' выводит следующее: "Текущий контекст безопасности не может быть отменен. пожалуйста переключиться на исходную базу данных, где вызывается" Выполнить как" и пытаться это снова. '

Чтобы решить проблему, я пробовал следующий подход

  • Итак, я следую этой ссылке http://www.databasejournal.com/features/mssql/article.php/3800181/Security-Context-of-Service-Broker-Internal-Activation.htm и создал пользователя с самоподписанным сертификатом (считая, что он это пользователь, который не имеет разрешения). Но он возвращает ту же ошибку, копая глубже, я обнаружил, что [внутренний]. [prepare_execution] в SSISDB имеет оператор "REVERT" в строке № 36, который выдает ошибку как это совсем не похоже на олицетворение.

    • Я попытался переместить хранимую процедуру RunSSIS в SSISDB и попытаться вызвать ее из хранимой процедуры активации, она была сбита как SSISDB, она не позволяет любому пользователю с SQL Server auth, он должен иметь Windows auth и User созданный сертификатом, очевидно, не имеет учетных данных Windows.

Мой вопрос

  • Я на правильном пути? Я, конечно, не ожидаю, что использование двух компонентов SQL-сервера будет сложным.
  • Если не в правильном подходе, то какой лучший подход к вызову службы у сервис-брокера? Я видел "Внешнюю активацию" для брокера службы SQL Server, но пока не изучил. Но я попытался бы придерживаться того, что живет внутри серверной среды и масштабируется, и не нравится идея установки другого компонента в среде prod (это всегда накладные расходы на поддержку персональные, так как есть еще одна точка, которая может сбой)

Я использую Windows auth, и мои учетные данные имеют доступ к sys_Admin.

Ответ 1

Я думаю, вы можете вытащить "WITH EXECUTE AS CALLER", и все (proc, а затем пакет, получивший вызов) будет запущен в контексте безопасности Service Broker. Пока этот контекст имеет права делать то, что вы хотите сделать, вы должны быть в порядке.

Я не использовал Service Broker таким образом, но я делаю то же самое с заданиями, запущенными агентом SQL. Пока контекст безопасности агента имеет разрешения, необходимые в procs/packages, все работает нормально. Мы используем сетевые учетные записи для наших сервисов, поэтому все это работает и между серверами.

Ответ 2

У этого есть запах кода с плотной связью, и мой первый инстинкт состоит в том, чтобы отделить очередь, БД, в которой находится proc, и выполнение SSIS в PowerShell script. Попросите script получить сообщения от сервисного брокера, затем вызовите SSISDB на другое соединение, не обернув [catalog].[create_execution] и [catalog].[set_execution_parameter_value] в сохраненный proc. Вы все еще можете запустить этот script непосредственно из агента.

Этот подход дает вам максимальную гибкость в отношении контекстов безопасности, если один из компонентов перемещается на другой сервер, если что-то по-разному называется dev/QA, или изменения технологий (например, Azure ServiceBus вместо Broker). Вы также можете создавать объявления с протоколированием/мониторингом.