Автоматизировать процесс табличной модели SSAS с помощью Azure - PullRequest
0 голосов
/ 08 июля 2019

У меня есть процесс, который использует фабрику данных 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.

1 Ответ

0 голосов
/ 26 июля 2019

Чтобы сделать ответ видимым для других, я суммирую ответ, который ОП поделился в комментарии:

Проблема была решена с помощью служебной учетной записи для олицетворения в SSAS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...