在 Azure 上,我通過 Powershell Runbook 從 100 個 Azure SQL 資料庫中的容器運行多個 .sql 檔案。
我希望 Powershell 讀取服務器名稱和資料庫名稱以從我的 SQL Server 表中運行腳本,如下所示:
服務器名稱 | 資料庫名稱 | 地位 |
---|---|---|
服務器-01 | DB-01 | 程序 |
服務器-01 | DB-02 | 跳過 |
服務器-02 | DB-03 | 程序 |
在我當前版本的 Powershell 腳本中,它可以讀取容器中的檔案并在給定的服務器和資料庫中運行它們:
# Get the blob container
$blobs = Get-AzStorageContainer -Name $containerName -Context $ctx | Get-AzStorageBlob
# Download the blob content to localhost and execute each one
foreach ($blob in $blobs)
{
$file = Get-AzStorageBlobContent -Container $containerName -Blob $blob.Name -Destination "." -Context $ctx
Write-Output ("Processing file :" $file.Name)
$query = Get-Content -Path $file.Name
Invoke-Sqlcmd -ServerInstance "Server-01.database.windows.net" -Database "DB-01" -Query $query -AccessToken $access_token
Write-Output ("This file is executed :" $file.Name)
}
我正在尋找一種方法,該方法將從表中讀取行并將它們輸入到Invoke-Sqlcmd中的-ServerInstance和-Database欄位中。理想情況下,它可以過濾掉Skip行。
uj5u.com熱心網友回復:
一種方法是將資料庫串列加載到 aDataTable
中并為每個查詢迭代串列。根據您的身份驗證方法更改$databaseListConnectionString
下面的示例代碼,并AccessToken
根據需要設定連接。
# get database list
$databaseListConnectionString = "Data Source=YourServer;Initial Catalog=YourDatabase"
$databaseListQuery = "SELECT ServerName, DatabaseName FROM dbo.DatabaseList WHERE Status = 'Process';"
$dataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($databaseListQuery, $databaseListConnectionString)
$dataAdapter.SelectCommand.Connection.AccessToken = $access_token
$databaseList = New-Object System.Data.DataTable
[void]$dataAdapter.Fill($databaseList)
# Get the blob container
$blobs = Get-AzStorageContainer -Name $containerName -Context $ctx | Get-AzStorageBlob
# Download the blob content to localhost and execute each one
foreach ($blob in $blobs) {
{
$file = Get-AzStorageBlobContent -Container $containerName -Blob $blob.Name -Destination "." -Context $ctx
Write-Output ("Processing file :" $file.Name)
$query = Get-Content -Path $file.Name
foreach($database in $databaseList.Rows) {
Invoke-Sqlcmd -ServerInstance "$($database.ServerName)" -Database "$($database.DatabaseName)" -Query $query -AccessToken $access_token
Write-Output ("This file is executed :" $file.Name)
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/527289.html