Требование - вызвать веб-службу через 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.