我正在编写一组 PowerShell 脚本来调用 SSIS 包,传递从 Azure 密钥保管库获取的 SQL 密码。 当 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
如果有 2 个或更多数据库需要传递密码,语法是什么? 我认为我不能包含 2 个 SET 语句
当 SSIS 包只有一个连接时,它就可以正常工作。 如果有 2 个或更多数据库需要传递密码,语法是什么?
设置一个包含数据库名称的数组,然后循环遍历每个名称来执行
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 /SET $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"