У меня есть процесс, который использует фабрику данных Azure для извлечения данных, обработки и передачи данных в базу данных SQL Azure.В конце данные из SQL Azure используются табличной моделью SSAS.На данный момент весь процесс до закачки данных в Azure SQL автоматизирован с помощью Azure Data Factory v2, но я не могу найти способ автоматической обработки табличной модели SSAS.Пожалуйста, дайте мне знать, если есть способ сделать то же самое.
Я хочу, чтобы ADF v2 каким-то образом вызывал его, чтобы табличные данные получали обновленные данные, как только новые данные закачиваются в SQL.Поскольку я не смог сделать это с помощью ADF v2, я попытался использовать Powershell.Это препятствие, с которым я сталкиваюсь, заключается в том, что мне нужно передать две учетные данные для обработки в виде таблицы 1. Аутентификация SQL-сервера для Azure SQL 2. Учетные данные Windows одного пользователя для олицетворения1003 *
Сценарий Powershell: -
param($ServerName="Your Server Name", $DBName="Your DB Name", $ProcessTypeDim="ProcessFull",$ProcessTypeMG="ProcessFull",
$Transactional="Y", $Parallel="Y",$MaxParallel=2,$MaxCmdPerBatch=1, $PrintCmd="N",
$logFilePath="Your Path where you want to save the log file")
## Add the AMO namespace
Write-Output "Process Starts for database $DBName :" | Out-File -FilePath $logFilePath
$loadInfo = [Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices")
if ($Transactional -eq "Y") {$TransactionalB=$true} else {$TransactionalB=$false}
if ($Parallel -eq "Y") {$ParallelB=$true} else {$ParallelB=$false}
$server = New-Object Microsoft.AnalysisServices.Server
$server.connect($ServerName)
if ($server.name -eq $null) {
Write-Output ("Server '{0}' not found" -f $ServerName)
Write-Output "Server '{0}' not found" -f $ServerName | Out-File -FilePath $logFilePath -Append
break
}
$DB = $server.Databases.FindByName($DBName)
if ($DB -eq $null) {
Write-Output ("Database '{0}' not found" -f $DBName)
Write-Output "Database '{0}' not found" -f $DBName | Out-File -FilePath $logFilePath -Append
break
}
$date_Start=Get-Date
Write-Output("Load start time {0}" -f (Get-Date -uformat "%H:%M:%S") )
Write-Output "Load start time: " (Get-Date -uformat "%H:%M:%S") | Out-File -FilePath $logFilePath -Append
Write-Output("----------------------------------------------------------------")
Write-Output "----------------------------------------------------------------"| Out-File -FilePath $logFilePath -Append
Write-Output("Server : {0}" -f $Server.Name)
Write-Output "Server :" $Server.Name | Out-File -FilePath $logFilePath -Append
Write-Output("Database: {0}" -f $DB.Name)
Write-Output "Database: " $DB.Name | Out-File -FilePath $logFilePath -Append
Write-Output("DB State: {0}" -f $DB.State)
Write-Output "DB State: " $DB.State | Out-File -FilePath $logFilePath -Append
Write-Output("DB Size : {0}MB" -f
($DB.EstimatedSize/1024/1024).ToString("#,##0"))
Write-Output "DB Size : " ($DB.EstimatedSize/1024/1024).ToString("#,##0")| Out-File -FilePath $logFilePath -Append
Write-Output("----------------------------------------------------------------")
Write-Output "----------------------------------------------------------------"| Out-File -FilePath $logFilePath -Append
Write-Output("DB processing started. Time: {0}" -f (Get-Date -uformat "%H:%M:%S"))
Write-Output "DB processing started. Time: " (Get-Date -uformat "%H:%M:%S")| Out-File -FilePath $logFilePath -Append
$server.CaptureXml=$TRUE # Just capture server statements, dont execute them
#Process dimensions
foreach ($dim in $DB.Dimensions) {
$dim.Process($ProcessTypeDim)
} # Dimensions
#Process cubes
foreach ($cube in $DB.Cubes) {
foreach ($mg in $cube.MeasureGroups) {
foreach ($part in $mg.Partitions) {
$part.Process($ProcessTypeMG)
}
}
}
# Separate step to process all linked measure groups. Linke MG does not have partitions
foreach ($cube in $DB.Cubes) {
foreach ($mg in $cube.MeasureGroups) {
if ($mg.IsLinked) {
$mg.Process($ProcessTypeMG)
}
}
}
$server.CaptureXML = $FALSE # Finish capturing statements. All statements are in Server.CaptureLog
$cmdBatch = @"
<Batch xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
<Parallel MaxParallel="##MaxParallel##">
##ProcessCmd##
</Parallel>
</Batch>
"@
$cmdBatch = $cmdBatch -replace("##MaxParallel##",$MaxParallel)
#$ErrorActionPreference = "SilentlyContinue"
$currentCmdNo=0; $currentCmdInBatchNo=0;
$processCmd="";$currentBatchNo=0
$TotalCmdCount = $Server.CaptureLog.Count
foreach ($cmdLine in $Server.CaptureLog) {
$currentCmdNo = $currentCmdNo + 1
$processCmd = $processCmd + $cmdLine + "`n"
$currentCmdInBatchNo=$currentCmdInBatchNo + 1
if ($currentCmdInBatchNo -ge $MaxCmdPerBatch -or $currentCmdNo -eq $TotalCmdCount) { #MaxCmdPerBatch reached, execute commands
$processCmd = $cmdBatch -replace("##ProcessCmd##", $processCmd)
if ($PrintCmd -eq "Y") { Write-Output($processCmd) }
$currentBatchNo = $currentBatchNo + 1;
Write-Output("=== Startining batch No {0}. Time: {1} ..." -f $currentBatchNo, (Get-Date -uformat "%H:%M:%S"))
Write-Output "=== Startining batch No $currentBatchNo. Time: ..." (Get-Date -uformat "%H:%M:%S")| Out-File -FilePath $logFilePath -Append
$Result = $Server.Execute($processCmd)
# Report errors and warnings
foreach ($res in $Result) {
foreach ($msg in $res.Messages) {
if ($msg.Description -ne $null) {
Write-Output("{0}" -f $msg.Description)
Write-Output $msg.Description| Out-File -FilePath $logFilePath -Append
}
}
}
# Reset temp values
$processCmd = ""; $currentCmdInBatchNo=0;
}
}#foreach
Write-Output("-------------------------Cube status----------------------------")
Write-Output("-------------------------Cube status----------------------------")| Out-File -FilePath $logFilePath -Append
$data=$DB.Cubes|select name,state,lastprocessed
Write-Output($data)
Write-Output $data| Out-File -FilePath $logFilePath -Append
Write-Output("--------------------Dimension status----------------------------")
Write-Output("--------------------Dimension status----------------------------")| Out-File -FilePath $logFilePath -Append
$data=$DB.Dimensions|select name,state,lastprocessed
Write-Output($data)
Write-Output $data| Out-File -FilePath $logFilePath -Append
Write-Output("-----------------Dimension related to cubes---------------------")
Write-Output("-----------------Dimension related to cubes---------------------")| Out-File -FilePath $logFilePath -Append
foreach ($cube in $DB.Cubes) {
Write-Output("Cube Name: $cube")
Write-Output "Cube Name: $cube"| Out-File -FilePath $logFilePath -Append
foreach ($dim in $DB.Dimensions) {
Write-Output(" $dim")
Write-Output " $dim"| Out-File -FilePath $logFilePath -Append
}
}
Write-Output("----------------------------------------------------------------")
Write-Output("----------------------------------------------------------------")| Out-File -FilePath $logFilePath -Append
$date_End=Get-Date
Write-Output("Load End Time: {0}" -f (Get-Date -uformat "%H:%M:%S"))
Write-Output "Load End Time: " (Get-Date -uformat "%H:%M:%S")| Out-File -FilePath $logFilePath -Append
$ptime="Total Processing Time :"+($date_End-$date_Start).Hours+" Hours, "+($date_End-$date_Start).Minutes+" Mins, "+($date_End-$date_Start).Seconds+" Secs "
Write-Output $ptime
Write-Output $ptime | Out-File -FilePath $logFilePath -Append
Сообщение об ошибке -
Ошибка OLE DB или ODBC: истекло время ожидания входа;HYT00;При установлении соединения с SQL Server произошла ошибка, связанная с сетью или экземпляром.Сервер не найден или недоступен.Проверьте, правильно ли указано имя экземпляра и настроен ли SQL Server для разрешения удаленных подключений.Для получения дополнительной информации см. SQL Server Books Online .;08001;Поставщик именованных каналов: не удалось открыть соединение с SQL Server [5].;08001.