При настройке пакета SSIS у вас есть 3 варианта: использовать значения времени разработки, вручную редактировать значения и использовать среду.
Подход 1
Я добился успеха со смесью двух последних. Я создаю папку: Configuration
и отдельную среду, Settings
. Никакие проекты не развертываются в Configuration.
Я заполняю среду настроек всем, что может использоваться в разных проектах. Строки подключения к базе данных, пользователи и пароли ftp, общие места обработки файлов и т. Д.
В каждом развернутом проекте все, что нам нужно настроить, обрабатывается с помощью явных переопределений. Например, имя файла изменяется в зависимости от среды, поэтому мы бы установили значение через редактор, но вместо того, чтобы нажимать ОК, мы нажимаем кнопку «Сценарий» вверху. Это вызывает звонок вроде
DECLARE @var sql_variant = N'DEV_Transpo*.txt';
EXEC SSISDB.catalog.set_object_parameter_value
@object_type = 20
, @parameter_name = N'FileMask'
, @object_name = N'LoadJobCosting'
, @folder_name = N'Accounting'
, @project_name = N'Costing'
, @value_type = V
, @parameter_value = @var;
Мы храним скрипты и запускаем их как часть миграции. Это привело к появлению некоторых скриптов, похожих на
SELECT @var = CASE @@SERVERNAME
WHEN 'SQLSSISD01' THEN N'DEV_Transpo*.txt'
WHEN 'SQLSSIST01' THEN N'TEST_Transpo*.txt'
WHEN 'SQLSSISP01' THEN N'PROD_Transpo*.txt'
END
Но это разовая задача, поэтому я не думаю, что это обременительно. Предположение о том, как работает наш материал, заключается в том, что он довольно статичен, как только мы его разберем, так что отток после того, как он работает, не так уж велик. Редко производители пересматривают свои стандарты именования.
Подход 2
Если вы сочтете такой подход неразумным, возможно, возобновите использование таблицы для настройки динамического материала. Я видел, как над этим работают две реализации.
Вариант А
Первый устанавливается внешним субъектом. По сути, это шаг настройки, описанный выше, но вместо сохранения статических скриптов простой курсор будет применять их.
--------------------------------------------------------------------------------
-- Set up
--------------------------------------------------------------------------------
CREATE TABLE dbo.OptionA
(
FolderName sysname
, ProjectName sysname
, ObjectName sysname
, ParameterName sysname
, ParameterValue sql_variant
);
INSERT INTO
dbo.OptionA
(
FolderName
, ProjectName
, ObjectName
, ParameterName
, ParameterValue
)
VALUES
(
'MyFolder'
, 'MyProject'
, 'MyPackage'
, 'MyParameter'
, 100
);
INSERT INTO
dbo.OptionA
(
FolderName
, ProjectName
, ObjectName
, ParameterName
, ParameterValue
)
VALUES
(
'MyFolder'
, 'MyProject'
, 'MyPackage'
, 'MySecondParameter'
, 'Foo'
);
Вышеупомянутое просто создает таблицу, которая определяет все конфигурации, которые должны быть применены, и куда они должны идти.
--------------------------------------------------------------------------------
-- You might want to unconfigure anything that matches the following query.
-- Use cursor logic from below substituting this as your source
--SELECT
-- *
--FROM
-- SSISDB.catalog.object_parameters AS OP
--WHERE
-- OP.value_type = 'V'
-- AND OP.value_set = CAST(1 AS bit);
--
-- Use the following method to remove existing configurations
-- in place of adding them
--
--EXECUTE SSISDB.catalog.clear_object_parameter_value
-- @folder_name = @FolderName
-- @project_name = @ProjectName
-- @object_type = 20
-- @object_name = @ObjectName
-- @parameter_name = @ParameterName
--------------------------------------------------------------------------------
Так начинается применение конфигураций
--------------------------------------------------------------------------------
-- Apply configurations
--------------------------------------------------------------------------------
DECLARE
@ProjectName sysname
, @FolderName sysname
, @ObjectName sysname
, @ParameterName sysname
, @ParameterValue sql_variant;
DECLARE Csr CURSOR
READ_ONLY FOR
SELECT
OA.FolderName
, OA.ProjectName
, OA.ObjectName
, OA.ParameterName
, OA.ParameterValue
FROM
dbo.OptionA AS OA
OPEN Csr;
FETCH NEXT FROM Csr INTO
@ProjectName
, @FolderName
, @ObjectName
, @ParameterName
, @ParameterValue;
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
EXEC SSISDB.catalog.set_object_parameter_value
-- 20 = project
-- 30 = package
@object_type = 30
, @folder_name = @FolderName
, @project_name = @ProjectName
, @parameter_name = @ParameterName
, @parameter_value = @ParameterValue
, @object_name = @ObjectName
, @value_type = V;
END
FETCH NEXT FROM Csr INTO
@ProjectName
, @FolderName
, @ObjectName
, @ParameterName
, @ParameterValue;
END
CLOSE Csr;
DEALLOCATE Csr;
Когда вы запускаете это? Всякий раз, когда его нужно запустить. Вы можете настроить триггер на OptionA, чтобы синхронизировать его, или сделать его частью процесса после развертывания. На самом деле все, что имеет смысл в вашей организации.
Вариант Б
Это будет похоже на предложение Винни. Я бы разработал пакет Parent / Orchestrator, который отвечает за поиск всех возможных конфигураций для проекта, а затем заполняет переменные. Затем используйте более чистую передачу переменных для дочерних пакетов с моделью развертывания проекта.
Лично меня этот подход не волнует, поскольку он возлагает большую ответственность на разработчиков, реализующих решение, за правильное кодирование. Я считаю, что у него более высокая стоимость обслуживания, и не всем разработчикам бизнес-аналитики нравится код. И этот сценарий должен быть реализован во множестве пакетов родительского типа и имеет тенденцию приводить к копированию и вставке наследования, что никому не нравится.
person
billinkc
schedule
22.09.2015