在 SQL Server SSAS 中,我想从服务器 A 到服务器 B 进行数据库恢复,其中数据库已存在于服务器 B 上。我想知道是否可以编写数据库权限脚本,以便稍后在服务器 B 上运行脚本来应用原来的设置。
我正在尝试使用 AMO,但我的编程知识有限,所以不完全确定它是如何工作的。
我知道我可以访问此信息:
[System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.AnalysisServices”)
$SSASServer = New-Object Microsoft.AnalysisServices.Server
$SSASServerName = 'serverNameA\PRD'
$SSASServer.Connect($SSASServerName)
$SSASServer.Version
$DBName = 'DB_A_PRD'
$SSASDatabase = $SSASServer.Databases.Item($DBName)
$SSASDatabase.Refresh()
稍后我可以获得有关特定角色的所有详细信息
foreach ($role in $SSASDatabase.Roles) {Write-Host $role.Name}
$SSASDatabase.DatabasePermissions.FindByRole($role.ID)
现在我可以在服务器 B 上重新创建角色
$roleToCreate = new-Object([Microsoft.AnalysisServices.Role])($var)
$SSASDatabase.Roles.Add($roleToCreate)
$roleToCreate.Update()
这就是我迷失的地方。我应该如何正确分配管理或处理权限给这个 $roleToCreate?
我见过另一个用户以这种方式应用读取设置,但我没有找到对管理或处理权限执行相同操作的方法:
$dbperm = $SSASDatabase.DatabasePermissions.Add($roleToCreate.ID)
$dbperm.Read = [Microsoft.AnalysisServices.ReadAccess]::Allowed
根据我在这里读到的内容: https://learn.microsoft.com/en-us/analysis-services/amo/programming-amo-security-objects?view=sql-analysis-services-2022这是可能的,但我不知道如何让它在 PowerShell 中工作。
我不能这样做,因为 $dbpermissions.Process = True,ps 无法识别它。 我想我需要做一些与具有读取权限的枚举类似的事情,但我不知道该怎么做。
我使用此文档作为参考: https://learn.microsoft.com/en-us/dotnet/api/microsoft.analysisservices?view=analysisservices-dotnet
我很难使用
$SSASDatabase.Roles.Add($roleToCreate)
添加角色。它会在终端上记录 0,表示没有添加任何内容。
我决定继续前进,并通过 TMSL 找到了不同的方法。该解决方案创建了一个新角色,但您也可以将其修改为createOrReplace。
$tabularName = "tableName"
$sqlServer = "ssasServer"
$json = @"
{
"create":{
"parentObject":{
"database":"$($tabularName)"
},
"role":{
"name":"NewRoleName",
"modelPermission":"read",
"members":[
{
"memberName": "domain\\username"
}
]
}
}
}
"@
$connectionString = "Data Source=$sqlServer;Initial Catalog=$tabularName"
Invoke-ASCmd -ConnectionString $connectionString -Query $json
有用的文档