Arhn - архитектура программирования

Вызов пакета SSIS с использованием входа в SQL Server

Я пытаюсь запустить процедуру ETL из приложения .NET с компонентами как в SQL, так и в SSIS. У меня нет никакого влияния на приложение .NET, кроме как создать кнопку, которая вызывает хранимую процедуру (включая передачу параметров). Приложению требуется учетная запись SQL Server для подключения к базе данных.

Моя проблема заключается в том, что я не могу запустить пакет SSIS с помощью входа в систему SQL (требуется вход в Windows), а приложение не может работать с входом в Windows (требуется вход в систему SQL). Как мне квадрат этого круга?

Подробнее

Приложение управляет десятками размеров склада, каждая из которых использует свой собственный процесс ETL. Код разработан так, что вы передаете Table_ID в хранимую процедуру, и эта процедура создает и запускает выполнение SSIS для запуска импорта. Остальная часть ETL выполняется на SQL. Значительно упрощенный сценарий динамического SQL будет выглядеть примерно так, как показано ниже, с выводом динамического SQL, показанным под ним:

CREATE PROCEDURE [Core].[Execute_Dimension] (@Dimension_Table_ID int) AS

-----------------------------------------
--DECLARE @Dimension_Table_ID INT  = 2001
-----------------------------------------

/************************************************
Declare variables to work with
************************************************/
DECLARE @Dimension_Table_Name   nvarchar(100)
DECLARE @SSIS_Project_Name      nvarchar(100)
DECLARE @sql_import             nvarchar(max) = N''
DECLARE @sql_transform          nvarchar(max) = N''
DECLARE @sql                    nvarchar(max)

SELECT  @Dimension_Table_Name           = [Dimension_Table_Name],
        @SSIS_Project_Name              = [SSIS_Project_Name]
FROM    [Core].[View_Dimension_Table]
WHERE   [Dimension_Table_ID] = @Dimension_Table_ID

/************************************************
Import
************************************************/
SET @sql_import = CONCAT(N'
-- ====================================================================================
-- Description:     Import Process

BEGIN TRY
    -----------------------------------------
    DECLARE @execution_id bigint
    DECLARE @SSISStatus int

    EXEC [SSISDB].[catalog].[create_execution]                  @package_name       = N''',@Dimension_Table_Name,N'_',@Dimension_Table_ID,N'.dtsx'',
                                                                @execution_id       = @execution_id OUTPUT,
                                                                @folder_name        = N''Trinity'',
                                                                @project_name       = N''',@SSIS_Project_Name,N''',
                                                                @use32bitruntime    = ''FALSE'',
                                                                @reference_id       = Null

    EXEC [SSISDB].[catalog].[set_execution_parameter_value]     @execution_id,
                                                                @object_type        = 50,
                                                                @parameter_name     = N''SYNCHRONIZED'',
                                                                @parameter_value    = 1

    EXEC [SSISDB].[catalog].[start_execution]                   @execution_id

    --Execution has failed if SSISDB status <> 7
    SELECT @SSISStatus = [Status] FROM [SSISDB].[catalog].[executions] WHERE [execution_id] = @execution_id

    -----------------------------------------
    IF @SSISStatus = 7
    BEGIN
        PRINT ''Import: Has Succeeded''
    END
    ELSE
    BEGIN
        PRINT ''Import: Has Failed''
    END
END TRY
    BEGIN CATCH
        PRINT ''Import: Has Failed''
    END CATCH
')

/************************************************
Transform
************************************************/
SET @sql_transform = CONCAT(N'
-- ====================================================================================
-- Description:     Transform Process

BEGIN TRY
    -----------------------------------------
    EXEC [Transform].[Proc_',@Dimension_Table_Name,N'_Transform]
    -----------------------------------------
    PRINT ''Transform: Has Succeeded''
END TRY
BEGIN CATCH
    PRINT ''Transform: Has Failed''
END CATCH

')

/************************************************
Package completed
************************************************/

SET @sql = CONCAT(  @sql_import,
                    @sql_transform
                    )

EXEC (@sql)

Дайте результат, подобный приведенному ниже:

-- ====================================================================================
-- Description:     Import Process

BEGIN TRY
    -----------------------------------------
    DECLARE @execution_id bigint
    DECLARE @SSISStatus int

    EXEC [SSISDB].[catalog].[create_execution]                  @package_name       = N'ActiveDirectoryUser_2001.dtsx',
                                                                @execution_id       = @execution_id OUTPUT,
                                                                @folder_name        = N'Trinity',
                                                                @project_name       = N'DataMart_ICT',
                                                                @use32bitruntime    = 'FALSE',
                                                                @reference_id       = Null

    EXEC [SSISDB].[catalog].[set_execution_parameter_value]     @execution_id,
                                                                @object_type        = 50,
                                                                @parameter_name     = N'SYNCHRONIZED',
                                                                @parameter_value    = 1

    EXEC [SSISDB].[catalog].[start_execution]                   @execution_id

    --Execution has failed if SSISDB status <> 7
    SELECT @SSISStatus = [Status] FROM [SSISDB].[catalog].[executions] WHERE [execution_id] = @execution_id

    -----------------------------------------
    IF @SSISStatus = 7
    BEGIN
        PRINT 'Import: Has Succeeded'
    END
    ELSE
    BEGIN
        PRINT 'Import: Has Failed'
    END
END TRY
    BEGIN CATCH
        PRINT 'Import: Has Failed'
    END CATCH

-- ====================================================================================
-- Description:     Transform Process

BEGIN TRY
    -----------------------------------------
    EXEC [Transform].[Proc_ActiveDirectoryUser_Transform]
    -----------------------------------------
    PRINT 'Transform: Has Succeeded'
END TRY
BEGIN CATCH
    PRINT 'Transform: Has Failed'
END CATCH
22.01.2018

  • Как вы выяснили, вы не можете запустить пакет SSIS с помощью входа в систему SQL. Вместо этого вы можете запустить задание агента (а затем учетная запись службы агента будет запускать пакет), или вам нужно будет использовать соединение, использующее надежное соединение. 22.01.2018
  • Мне любопытно - что означает, что я не могу запустить пакет SSIS с помощью входа в систему SQL (требуется вход в Windows) - вы получаете сообщение об ошибке при попытке? Я бы предположил, что процесс будет запускаться под учетной записью службы SQL Server или учетной записью агента SQL или, возможно, даже какой-либо учетной записью службы SSIS. 23.01.2018
  • О, вот оно: sqlservercentral.com/Forums/1860473/ Могу я предложить вам в следующий раз опубликовать сообщение об ошибке. 23.01.2018
  • Читая вокруг .. похоже, что лучший вариант - создать очередь. Кнопка помещает запрос в очередь, и задание агента SQL берет его и запускает. Независимо от того, вам нужно назначить учетную запись службы Windows, которая выполняет эту работу. 23.01.2018

Ответы:


1

Должна быть возможность запускать скрипт от имени другого пользователя или группы в соответствии с объяснением здесь. вкратце объяснил, что это должно выглядеть так:

  1. добавить IMPERSONATE грант
  2. сопоставить логины Windows и SQL server в БД (создать пользователей)
  3. попробуйте использовать EXECUTE в качестве 'входа в Windows здесь'
  4. Выполните свой сценарий
  5. Не забудьте позвонить в REVERT, чтобы избежать непредвиденных обстоятельств и несанкционированного доступа.
22.01.2018

2

Спасибо за ответы. Однако я не добился успеха, пытаясь реализовать их, особенно в отношении элемента SSIS скрипта.

Я запускаю следующее ...

--[domain/windowsuser] has sysadmin server role, but no explicit user asigned to individual databases

USE [DataMart_ICT]

CREATE USER [domain/windowsuser] FOR LOGIN [domain/windowsuser]
ALTER ROLE [db_owner] ADD MEMBER [domain/windowsuser]

CREATE USER [DBF_App_Admin] FOR LOGIN [DBF_App_Admin]
ALTER ROLE [db_owner] ADD MEMBER [DBF_App_Admin]

GRANT IMPERSONATE ON USER::[domain/windowsuser] TO [DBF_App_Admin]

... попытаться запустить этот раздел кода, который я представил ранее (бит, вызывающий проблемы) ...

USE [DataMart_ICT]
GO

    EXECUTE AS LOGIN = 'domain/windowsuser'

        -----------------------------------------
        DECLARE @execution_id bigint
        DECLARE @SSISStatus int

        EXEC [SSISDB].[catalog].[create_execution]                  @package_name       = N'ActiveDirectoryUser_2001.dtsx',
                                                                    @execution_id       = @execution_id OUTPUT,
                                                                    @folder_name        = N'Trinity',
                                                                    @project_name       = N'DataMart_ICT',
                                                                    @use32bitruntime    = 'FALSE',
                                                                    @reference_id       = Null

        EXEC [SSISDB].[catalog].[set_execution_parameter_value]     @execution_id,
                                                                    @object_type        = 50,
                                                                    @parameter_name     = N'SYNCHRONIZED',
                                                                    @parameter_value    = 1

        EXEC [SSISDB].[catalog].[start_execution]                   @execution_id

        --Execution has failed if SSISDB status <> 7
        SELECT @SSISStatus = [Status] FROM [SSISDB].[catalog].[executions] WHERE [execution_id] = @execution_id

USE [DataMart_ICT]
GO
REVERT

... и получите следующую ошибку:

The current security context cannot be reverted. Please switch to the original database where 'Execute As' was called and try it again.

Проблема, похоже, связана с EXEC [SSISDB]. [Catalog]. [Start_execution]. Если я закомментирую эту строку, она работает. Глядя на эту процедуру (созданную и определенную MS), она уже содержит собственные EXECUTE AS и REVERT, и я, очевидно, не могу это изменить.

У меня возникает аналогичная проблема, если я вызываю [msdb]. [Dbo]. [Sp_start_job], который мне понадобится, если бы я вызвал задание SQL, которое инициировало пакет SSIS.

23.01.2018
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..