Как изменить строку подключения для каждой базы данных на каждом сервере - PullRequest
0 голосов
/ 25 октября 2018

Скажем, у меня 2 сервера, сервер 1 и сервер 2.

На каждом сервере есть x баз данных, каждая из которых имеет соединение с глобальной базой данных.

server1 имеет базу данных1,база данных2, база данных3.

server2 имеет базу данных4, базу данных5

У нас будет 2 файла, один файл содержит серверы, а другой содержит «базы данных»

, тогда цикл будет:

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

как я могу заставить этот цикл знать, что ондолжен выйти из внутреннего цикла, когда database1-3 завершил работу с server1, и теперь вам нужно перейти к externalloop для подключения к server2 для баз данных4 и 5.

Класс ConnectionInfo: https://docs.microsoft.com/it-it/dotnet/api/microsoft.analysisservices.connectioninfo?view=sqlserver-2016

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Видя ваш последний комментарий о желании использовать CSV-файл для заполнения Hashtable, вы можете сделать это:

Предположим, что ваш 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\StackOverflow\Databases.csv' | Group-Object Server | ForEach-Object {
    $h += @{$($_.Name) = $_.Group.Database}
}

Далее вы можете использовать цикл, описанный Томом Шумахером:

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"

В этом случае вы можете прочитать его в Hashtable следующим образом:

$h = @{}
Import-Csv '<PATH_TO_THE_CSV_FILE>' | ForEach-Object {
    $h += @{$($_.Server) = ($_.Database -split '\s*,\s*') }
}

Если ваш CSV-файл имеет не , заголовки, такие каквыше, используйте переключатель -Header командлета Import-Csv, чтобы дать столбцам имя, с которым мы можем работать следующим образом:

    Import-Csv '<PATH_TO_THE_CSV_FILE>' -Header 'Server','Database'
0 голосов
/ 25 октября 2018

Я предлагаю вам создать хеш-таблицу, в которой вы назначаете значения базы данных каждому серверу.

$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=…."

    }
}
...