如何更改每个服务器中每个数据库的连接字符串
How to change connection string for each database in each server
假设我有 2 个服务器服务器 1 和服务器 2。
在每个服务器中有 x 个数据库,每个数据库都连接到一个全局数据库。
server1 has database1, datatabse2, database3.
server2 has database4, database5
我们会有 2 个文件,一个包含服务器,另一个包含 "databases"
那么循环将是:
Import-Module SqlServer
foreach ($server in $servers_file)
{
$Analysis_Server = New-Object Microsoft.AnalysisServices.Server
$Analysis_Server.connect("$server")
foreach ($database in $databases_file)
{
$database = $Analysis_Server.Databases.FindByName($database)
####### Setting connection property for $database #######
$database.DataSources[0].ConnectionString = "UserId=…;Password=…."
}
}
这里的问题是这个循环没有考虑数据库属于服务器的位置。
例如,如果我的数据库文件为:
database1
database2
database3
database4
database5
当数据库 1-3 从服务器 1 完成后,我如何让这个循环知道它必须退出内部循环,现在您必须继续进行外部循环以连接到数据库 4 和 5 的服务器 2。
我建议您创建一个哈希表,在其中将数据库值分配给每个服务器。
$h=@{'server1'=( 'database1','database2','database3');'server2'=( 'database4','database5')}
然后你的循环变成:
foreach($key in $h.keys){
$Analysis_Server = New-Object Microsoft.AnalysisServices.Server
$Analysis_Server.connect("$key")
foreach($value in $h[$key])
{
write-output "$key - has db $value"
$database = $Analysis_Server.Databases.FindByName($database)
####### Setting connection property for $database #######
$database.DataSources[0].ConnectionString = "UserId=…;Password=…."
}
}
看到您上次关于要使用 csv 文件填充哈希表的评论,您可以这样做:
假设您的 CSV 看起来像这样
"Server","Database"
"server1","database1"
"server2","database4"
"server1","database2"
"server1","database3"
"server2","database5"
然后您可以使用 Import-Csv
读取它并像这样从中创建一个散列
$h = @{}
Import-Csv '<PATH_TO_THE_CSV_FILE>' | Group-Object Server | ForEach-Object {
$db = @()
foreach ($item in $_.Group) {
$db += $item.Database
}
$h += @{$($_.Name) = $db}
}
根据您的 PowerShell 版本(我认为您至少需要 5.1),您可以通过以下方式简化之前的版本:
$h = @{}
Import-Csv 'D:\Code\PowerShell\Whosebug\Databases.csv' | Group-Object Server | ForEach-Object {
$h += @{$($_.Name) = $_.Group.Database}
}
接下来您可以使用 thom schumacher 描述的循环:
foreach($server in $h.Keys){
$Analysis_Server = New-Object Microsoft.AnalysisServices.Server
$Analysis_Server.connect("$server")
foreach($db in $h[$server]) {
write-output "$server - has db $db"
$database = $Analysis_Server.Databases.FindByName($db)
####### Setting connection property for $database #######
$database.DataSources[0].ConnectionString = "UserId=…;Password=…."
}
}
编辑
根据您的评论,我了解到您的 csv 文件如下所示:
"Server","Database"
"server1", "database1, database2, database3"
"server2","database4, database5"
在这种情况下,您可以像这样将其读入哈希表:
$h = @{}
Import-Csv '<PATH_TO_THE_CSV_FILE>' | ForEach-Object {
$h += @{$($_.Server) = ($_.Database -split '\s*,\s*') }
}
如果您的 CSV 文件 没有 像上面那样 headers,请在 Import-Csv
cmdlet 上使用 -Header
开关来提供列我们可以这样使用的名称:
Import-Csv '<PATH_TO_THE_CSV_FILE>' -Header 'Server','Database'
假设我有 2 个服务器服务器 1 和服务器 2。
在每个服务器中有 x 个数据库,每个数据库都连接到一个全局数据库。
server1 has database1, datatabse2, database3.
server2 has database4, database5
我们会有 2 个文件,一个包含服务器,另一个包含 "databases"
那么循环将是:
Import-Module SqlServer
foreach ($server in $servers_file)
{
$Analysis_Server = New-Object Microsoft.AnalysisServices.Server
$Analysis_Server.connect("$server")
foreach ($database in $databases_file)
{
$database = $Analysis_Server.Databases.FindByName($database)
####### Setting connection property for $database #######
$database.DataSources[0].ConnectionString = "UserId=…;Password=…."
}
}
这里的问题是这个循环没有考虑数据库属于服务器的位置。
例如,如果我的数据库文件为:
database1
database2
database3
database4
database5
当数据库 1-3 从服务器 1 完成后,我如何让这个循环知道它必须退出内部循环,现在您必须继续进行外部循环以连接到数据库 4 和 5 的服务器 2。
我建议您创建一个哈希表,在其中将数据库值分配给每个服务器。
$h=@{'server1'=( 'database1','database2','database3');'server2'=( 'database4','database5')}
然后你的循环变成:
foreach($key in $h.keys){
$Analysis_Server = New-Object Microsoft.AnalysisServices.Server
$Analysis_Server.connect("$key")
foreach($value in $h[$key])
{
write-output "$key - has db $value"
$database = $Analysis_Server.Databases.FindByName($database)
####### Setting connection property for $database #######
$database.DataSources[0].ConnectionString = "UserId=…;Password=…."
}
}
看到您上次关于要使用 csv 文件填充哈希表的评论,您可以这样做:
假设您的 CSV 看起来像这样
"Server","Database"
"server1","database1"
"server2","database4"
"server1","database2"
"server1","database3"
"server2","database5"
然后您可以使用 Import-Csv
读取它并像这样从中创建一个散列
$h = @{}
Import-Csv '<PATH_TO_THE_CSV_FILE>' | Group-Object Server | ForEach-Object {
$db = @()
foreach ($item in $_.Group) {
$db += $item.Database
}
$h += @{$($_.Name) = $db}
}
根据您的 PowerShell 版本(我认为您至少需要 5.1),您可以通过以下方式简化之前的版本:
$h = @{}
Import-Csv 'D:\Code\PowerShell\Whosebug\Databases.csv' | Group-Object Server | ForEach-Object {
$h += @{$($_.Name) = $_.Group.Database}
}
接下来您可以使用 thom schumacher 描述的循环:
foreach($server in $h.Keys){
$Analysis_Server = New-Object Microsoft.AnalysisServices.Server
$Analysis_Server.connect("$server")
foreach($db in $h[$server]) {
write-output "$server - has db $db"
$database = $Analysis_Server.Databases.FindByName($db)
####### Setting connection property for $database #######
$database.DataSources[0].ConnectionString = "UserId=…;Password=…."
}
}
编辑
根据您的评论,我了解到您的 csv 文件如下所示:
"Server","Database"
"server1", "database1, database2, database3"
"server2","database4, database5"
在这种情况下,您可以像这样将其读入哈希表:
$h = @{}
Import-Csv '<PATH_TO_THE_CSV_FILE>' | ForEach-Object {
$h += @{$($_.Server) = ($_.Database -split '\s*,\s*') }
}
如果您的 CSV 文件 没有 像上面那样 headers,请在 Import-Csv
cmdlet 上使用 -Header
开关来提供列我们可以这样使用的名称:
Import-Csv '<PATH_TO_THE_CSV_FILE>' -Header 'Server','Database'