如何更改每个服务器中每个数据库的连接字符串

时间:2018-10-24 22:55:01

标签: powershell azure-analysis-services

说我有2台服务器,分别是服务器1和服务器2。

每个服务器中有x个数据库,每个数据库都与全局数据库建立连接。

  

服务器1具有数据库1,数据表2,数据库3。

     

服务器2具有数据库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=…."
    }

} 

这里的问题是此循环不考虑服务器的数据库所属位置。

例如,如果我的数据库文件为:

  

数据库1

     

数据库2

     

数据库3

     

数据库4

     

数据库5

如何使该循环知道当server1-3中的database1-3完成时它必须退出内部循环,现在您必须继续进行外循环以连接database4和5的server2。

ConnectionInfo类:https://docs.microsoft.com/it-it/dotnet/api/microsoft.analysisservices.connectioninfo?view=sqlserver-2016

2 个答案:

答案 0 :(得分:1)

我建议您创建一个哈希表,在其中将数据库值分配给每个服务器。

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

    }
}

答案 1 :(得分:1)

看到您对要使用csv文件填充哈希表的最后评论,可以执行以下操作:

假设您的CSV看起来像这样

-c 4

然后您可以使用"Server","Database" "server1","database1" "server2","database4" "server1","database2" "server1","database3" "server2","database5" 读取它,并像这样从中创建一个哈希值

Import-Csv

根据您的PowerShell版本(我认为您至少需要5.1),您可以通过以下操作简化前一个版本:

$h = @{}
Import-Csv '<PATH_TO_THE_CSV_FILE>' | Group-Object Server | ForEach-Object {
    $db = @()
    foreach ($item in $_.Group) {
        $db += $item.Database 
    }
    $h += @{$($_.Name) = $db}
}

接下来,您可以使用thom schumacher所述的循环:

$h = @{}
Import-Csv 'D:\Code\PowerShell\StackOverflow\Databases.csv' | Group-Object Server | ForEach-Object {
    $h += @{$($_.Name) = $_.Group.Database}
}

修改

从您的评论中,我收集到您的csv文件,如下所示:

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

    }
}

在这种情况下,您可以像这样将其读取到Hashtable中:

"Server","Database"
"server1", "database1, database2, database3"
"server2","database4, database5"

如果您的CSV文件没有具有上述标题,请使用$h = @{} Import-Csv '<PATH_TO_THE_CSV_FILE>' | ForEach-Object { $h += @{$($_.Server) = ($_.Database -split '\s*,\s*') } } cmdlet上的-Header开关为这些列提供一个我们可以使用的名称,如下所示:

Import-Csv