Сводка: я использую Invoke-ASCmd –InputFile «$ templateLocation» -Server $ serverName в PowerShell для развертывания модели / таблицы на Azure сервере Analysis Services (AAS). Проблема в том, что я получаю сообщение об ошибке «Invoke-ASCmd: индекс вышел за пределы массива» * .
Подробности: у меня уже есть база данных, развернутая на сервере AAS с OAuth, и она есть только одна таблица. Я хочу добавить другую таблицу, используя шаблон файла Json. Я проделал ту же процедуру, используя локальный сервер служб Analysis Services с Windows аутентификацией и модель, созданную с помощью SQL серверных таблиц - и она работала отлично.
Теперь разница в том, что моему серверу AAS требуется OAuth-аутентификация. Кроме того, модель была создана с таблицами, которые являются текстовыми файлами в озере данных Azure. В итоге, я хотел знать, как я могу добавить таблицу в существующую модель AAS без , при этом необходимо использовать автоматизацию учетных данных, runbooks и т. Д. c.
Вот мой сценарий PowerShell.
###########################
#Location of Templates
###########################
$masterFolderLocation = "C:\Templates\"
$templateLocation = $masterFolderLocation + 'MyModel.json' # xmla/json with one table to be added to model
Write-Output "Template location:" $templateLocation
###########################
#Variables
###########################
$databaseName = "MyDatabase" # This database already exists in the AAS server
$serverName = "asazure://aspaaseastus2.asazure.windows.net/myserver"; # Azure Analysis Services Server
###########################
#Server Connection
###########################
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices.Tabular")
$svr = New-Object Microsoft.AnalysisServices.Tabular.Server
$svr.Connect($serverName)
###########################
#Count number of databases
###########################
$database = $svr.databases[1]
Write-Host "Number of Databases in the server:" $svr.databases[1].model.tables.count
###########################
#Refresh Model
###########################
Write-Host "Refreshing model..."
$database = $svr.Databases[$databaseName]
$model = $database.Model
$model.RequestRefresh([Microsoft.AnalysisServices.Tabular.RefreshType]::Full)
###########################
#Save Changes
###########################
Write-Host "Saving model..."
$database.Model.SaveChanges()
###########################
#Deploy
###########################
Invoke-ASCmd –InputFile "$templateLocation" -Server $serverName
Вот ошибка, которую я получаю:
Invoke-ASCmd : Index was outside the bounds of the array.
At C:\Users\StackOverflow.ps1:45 char:1
+ Invoke-ASCmd –InputFile "$templateTabular" -Server $serverName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Invoke-ASCmd], IndexOutOfRangeException
+ FullyQualifiedErrorId : System.IndexOutOfRangeException,Microsoft.AnalysisServices.PowerShell.Cmdlets.ExecuteScriptCommand
Вот мой шаблон Json (предназначенный для добавления только одной таблицы в уже существующую базу данных / модель)
{
"create": {
"parentObject": {
"database": "MyDatabase"
},
"table": {
"name": "Department",
"columns": [
{
"name": "DepartmentId",
"dataType": "int64",
"isHidden": true,
"sourceColumn": "DepartmentId",
"summarizeBy": "none"
},
{
"name": "Department",
"dataType": "string",
"sourceColumn": "Department"
}
],
"partitions": [
{
"name": "Partition",
"dataView": "full",
"source": {
"type": "m",
"expression": [
"let",
" Source=GetFileList(),",
" #\"Department txt\" = Source{[Name=\"Department.txt\"]}[Content],",
" #\"Imported CSV\" = Csv.Document(#\"Department txt\",[Delimiter=\"|\", Columns=5, Encoding=65001, QuoteStyle=QuoteStyle.None]),",
" #\"Promoted Headers\" = Table.PromoteHeaders(#\"Imported CSV\", [PromoteAllScalars=true]),",
" #\"Changed Type\" = Table.TransformColumnTypes(#\"Promoted Headers\",{{\"DepartmentId\", Int64.Type}, {\"Department\", type text})",
"in",
" #\"Changed Type\""
]
}
}
]
}
}
}