Я пытаюсь запустить процедуру 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