Я пишу группу сценариев 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.
да, мне нужно передавать пароль для каждого подключения к базе данных - могу ли я ввести 2 оператора /SET или есть способ создать коллекцию заданных параметров?
Учетные данные находятся в строке подключения. Вам нужна отдельная строка подключения для каждого подключения. Dtsx — это XML-файл для инструкций обработки SSIS, а не подключения к базе данных.
Пакет dtsx имеет отдельное соединение для каждой необходимой ему базы данных. Это не то, о чем я спрашиваю. Я хочу знать, как создать оператор DTEXEC, включающий объект соединения для двух разных соединений (или более). Какой синтаксис работает? Мои усилия на сегодняшний день выдают ошибку.
Согласно странице документа dtexec вы можете иметь несколько параметров /Set. Они даже показывают пример с 2 параметрами /Set.
Зачем вам нужен один оператор («оператор DTEXEC»)? Используйте два оператора set.
Когда пакет SSIS имеет одно соединение, он работает нормально. Каков синтаксис, если существует две или более базы данных для передачи пароля?
Настройте массив с именами баз данных, затем пройдите по каждому имени, чтобы выполнить команду 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"
};
Определите массив имен баз данных, а затем используйте 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. Это будет синтаксис и решения, которые вам нужны.
Я взял №2 — с исправлением синтаксиса — удалил /SET перед $joinsets в команде DTEXEC — в $joinsets были команды /SET
Извините за оплошность, я исправил это в логике №2. Рад, что это помогло вам найти решение, несмотря ни на что.
Мне пришлось изменить /SET следующим образом: добавить .Value и заключить каждый пароль в двойные кавычки с обратной косой чертой следующим образом: /SET ".....Properties[Password].Value";\"22-символьный пароль" - пароль имеет быть включенным как отдельное свойство в ConnectionString в конфигурации
SQL-сервер может иметь одну или несколько баз данных. Вам нужно отдельное соединение для каждой базы данных. Вы не можете иметь одно соединение для двух баз данных.