PowerShell Вызов пакета SSIS, передача двух (или более) параметров

Я пишу группу сценариев PowerShell для вызова пакетов SSIS, передавая пароль SQL, полученный из хранилища ключей Azure. Когда пакет SSIS имеет одно соединение, он работает нормально - например:

    DTEXEC /FILE "./$ProcessName.dtsx" /CONFIGFILE "$ScriptDirectory\config\$env\$ProcessName.dtsConfig" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF /CONSOLELOG SM /REPORTING EWCDI /SET "\Package.Connections[DATABASE.INC.DB].Properties[Password];$secretpwd" > $SSISLog

каков синтаксис, если есть две или более базы данных для передачи пароля? Я не думаю, что смогу включить два оператора SET.

SQL-сервер может иметь одну или несколько баз данных. Вам нужно отдельное соединение для каждой базы данных. Вы не можете иметь одно соединение для двух баз данных.

jdweng 02.07.2024 21:13

да, мне нужно передавать пароль для каждого подключения к базе данных - могу ли я ввести 2 оператора /SET или есть способ создать коллекцию заданных параметров?

Marianne Seggerman 03.07.2024 14:49

Учетные данные находятся в строке подключения. Вам нужна отдельная строка подключения для каждого подключения. Dtsx — это XML-файл для инструкций обработки SSIS, а не подключения к базе данных.

jdweng 03.07.2024 15:13

Пакет dtsx имеет отдельное соединение для каждой необходимой ему базы данных. Это не то, о чем я спрашиваю. Я хочу знать, как создать оператор DTEXEC, включающий объект соединения для двух разных соединений (или более). Какой синтаксис работает? Мои усилия на сегодняшний день выдают ошибку.

Marianne Seggerman 03.07.2024 20:26

Согласно странице документа dtexec вы можете иметь несколько параметров /Set. Они даже показывают пример с 2 параметрами /Set.

Jake Munson 03.07.2024 21:24

Зачем вам нужен один оператор («оператор DTEXEC»)? Используйте два оператора set.

jdweng 03.07.2024 21:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда пакет SSIS имеет одно соединение, он работает нормально. Каков синтаксис, если существует две или более базы данных для передачи пароля?

Два потенциальных решения

№1

Настройте массив с именами баз данных, затем пройдите по каждому имени, чтобы выполнить команду DTEXEC, динамически вводя в команду имя базы данных и пароль. Таким образом обрабатывается несколько подключений к базе данных без использования нескольких операторов SET.

$dbs = @("DATABASE.INC.DB","DATABASE.INC.XY","DATABASE.INC.ABC");
foreach($db in $dbs){ 
    DTEXEC /FILE "./$ProcessName.dtsx" /CONFIGFILE "$ScriptDirectory\config\$env\$ProcessName.dtsConfig" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF /CONSOLELOG SM /REPORTING EWCDI /SET "\Package.Connections[$db].Properties[Password];$secretpwd" > $SSISLog
    ##Write-Host "DTEXEC /FILE `"./$ProcessName.dtsx`" /CONFIGFILE `"$ScriptDirectory\config\$env\$ProcessName.dtsConfig`" /MAXCONCURRENT `" -1 `" /CHECKPOINTING OFF /CONSOLELOG SM /REPORTING EWCDI /SET `"\Package.Connections[$db].Properties[Password];$secretpwd`" > $SSISLog"
    };

#2

Определите массив имен баз данных, а затем используйте ForEach-Object, чтобы создать еще один массив операторов /SET для каждой базы данных. Объедините операторы /SET в одну строку и объедините их с командой DTEXEC при выполнении, используя несколько операторов /SET за одно выполнение.

$dbs = @("DATABASE.INC.DB","DATABASE.INC.XY","DATABASE.INC.ABC");
$sets = $dbs | ForEach-Object {"/SET `"\Package.Connection[$_].Properties[Password];$($secretpwd)`""};
$joinSets = $sets -join " ";

DTEXEC /FILE "./$ProcessName.dtsx" /CONFIGFILE "$ScriptDirectory\config\$env\$ProcessName.dtsConfig" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF /CONSOLELOG SM /REPORTING EWCDI $joinSets > $SSISLog
##Write-Host "DTEXEC /FILE `"./$ProcessName.dtsx`" /CONFIGFILE `"$ScriptDirectory\config\$env\$ProcessName.dtsConfig`" /MAXCONCURRENT `" -1 `" /CHECKPOINTING OFF /CONSOLELOG SM /REPORTING EWCDI /SET $joinSets > $SSISLog"
  • /Set [$Sensitive::]propertyPath;value: (Необязательно). Переопределяет настройка параметра, переменной, свойства, контейнера, журнала поставщик, перечислитель Foreach или соединение внутри пакета. Когда используется эта опция, /Set меняет аргумент propertyPath на указано значение. Можно указать несколько вариантов /Set.

    Источник

Как показывают ваши примеры PowerShell и согласно тегу powershell в вопросе, предполагается, что эти команды уже выполняются в PowerShell для вас прямо в командном терминале или скрипте в соответствии с вашим примером с переменными в них, поэтому предполагается, что зацикленные команды будут работать. так же. В противном случае вам может потребоваться изучить Invoke-Expression, чтобы выполнять команды по мере их создания. Здесь много двойных кавычек, но я предполагаю, что они теперь работают для вас и будут работать с расширенными дополнительными переменными прямо из PowerShell. Это будет синтаксис и решения, которые вам нужны.

Bitcoin Murderous Maniac 04.07.2024 03:54

Я взял №2 — с исправлением синтаксиса — удалил /SET перед $joinsets в команде DTEXEC — в $joinsets были команды /SET

Marianne Seggerman 05.07.2024 15:21

Извините за оплошность, я исправил это в логике №2. Рад, что это помогло вам найти решение, несмотря ни на что.

Bitcoin Murderous Maniac 05.07.2024 15:43

Мне пришлось изменить /SET следующим образом: добавить .Value и заключить каждый пароль в двойные кавычки с обратной косой чертой следующим образом: /SET ".....Properties[Password].Value";\"22-символьный пароль" - пароль имеет быть включенным как отдельное свойство в ConnectionString в конфигурации

Marianne Seggerman 15.07.2024 16:28

Другие вопросы по теме