Как изменить только строку подключения? - PullRequest
0 голосов
/ 10 ноября 2018

Очевидно, что базы данных / кубы на сервере анализа содержат параметр «сценарий подключения как> изменить», например, так:

script_connection_as

Я хочу использовать скрипт powershell, например так:

    $hashtable = @{}
Import-Csv "CSV_file" | ForEach-Object {
    $hashtable += @{$($_.Server) = ($_.Cube -split '\s*,\s*') }
}

Import-Module SqlServer

foreach($server in $hashtable.Keys){ 

   $Analysis_Server = New-Object Microsoft.AnalysisServices.Server  
   $Analysis_Server.connect("$server") 

   foreach($CUBE in $hashtable[$server]) {

      ####### Setting connection property for $Cube #######
"  
    <Alter ObjectExpansion="ExpandFull" xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
    <Object>
        <DatabaseID>$CUBE</DatabaseID>
    </Object>
    <ObjectDefinition>
        <DataSource xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" xmlns:ddl100_100="http://schemas.microsoft.com/analysisservices/2008/engine/100/100" xmlns:ddl200="http://schemas.microsoft.com/analysisservices/2010/engine/200" xmlns:ddl200_200="http://schemas.microsoft.com/analysisservices/2010/engine/200/200" xmlns:ddl300="http://schemas.microsoft.com/analysisservices/2011/engine/300" xmlns:ddl300_300="http://schemas.microsoft.com/analysisservices/2011/engine/300/300" xmlns:ddl400="http://schemas.microsoft.com/analysisservices/2012/engine/400" xmlns:ddl400_400="http://schemas.microsoft.com/analysisservices/2012/engine/400/400" xmlns:ddl500="http://schemas.microsoft.com/analysisservices/2013/engine/500" xmlns:ddl500_500="http://schemas.microsoft.com/analysisservices/2013/engine/500/500" xsi:type="RelationalDataSource">
            <ConnectionString>Connection Timeout=60;User Id=someID;Password=pass;Data Source=td.domain.com;Persist Security Info=True;Session Character Set=UTF8</ConnectionString>
        </DataSource>
    </ObjectDefinition>
    </Alter>
    "

    }
}

, который принимает входной файл CSV

Сервер, Куб

server1.domain.com, Database1

и просматривает базы данных / кубы на сервере, чтобы изменить их источник данных <ConnectionString>

Однако я уверен, что в этом скрипте чего-то не хватает, но дело в том, что, если я запускаю этот XML в SSMS, он жалуется на элемент <Name> для <DataSource>. Я понимаю, что необходим полный XML, но он не будет работать с точки зрения сценария, который я пытаюсь выполнить, потому что у меня не может быть тот же источник данных для других баз данных, которые есть на сервере. возможно, все они разные, поэтому ID, имя и т. д. должны быть удалены из XML-запроса в сценарии powershell.

я получаю эту ошибку

Определение объекта, предоставленное для инструкции ALTER, относится к другому типу, что ссылка на объект, подлежащая изменению.


Примечание : причина, по которой я вместо этого не использую свойства сервера анализа, заключается в том, что метод свойств анализа, который я здесь пробовал Свойство ConnectionString не печатает строку соединения

не работал и был передан в Microsoft как испорченное свойство,

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Мы вместе узнали, что SQL Server 2016 или выше работает с уровнем совместимости 1200 или выше. Всякий раз, когда вы работаете на уровне 1200 или выше, вы не можете использовать классические объекты AMO для работы с различными свойствами.

Microsoft на самом деле очень четко заявляет: Программирование с использованием объектов управления анализом (AMO)

Если вы программируете для табличных моделей на уровне совместимости 1200 или выше, используйте Табличную объектную модель (TOM) . TOM является расширением клиентской библиотеки объекта управления службами анализа (AMO).

Изучение TOM - это то же самое, что и изучение AMO в те времена. Вы должны начать где-то так: Табличная объектная модель (TOM)

Мы обнаружили, что это работает

Import-Module SqlServer

$newConnectionString = "Connection Timeout=60;User Id=SOME_NEW_ID;Data Source=10.10.19.10;Persist Security Info=True;Session Character Set=UTF8"

$svr = new-Object Microsoft.AnalysisServices.Tabular.Server
$svr.Connect("server1.domain.com")

$svr.databases[1].model.datasources[0].ConnectionString = $newConnectionString
$svr.Databases[1].Update([Microsoft.AnalysisServices.UpdateOptions]::ExpandFull)
0 голосов
/ 11 ноября 2018

Итак - на основании результатов @thom schumacher из вашего другого вопроса ( находится здесь )

$Analysis_Server = New-Object Microsoft.AnalysisServices.Server
$Analysis_Server.connect("AX2012R2A")

#Getting current state
PS C:\Users\Administrator> $Analysis_Server.Databases | ForEach-Object {$_.datasources | ForEach-Object {$_.ConnectionSt
ring}}
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_4
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_2
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_1
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_6
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_3
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_5

#Setting the new connection string in variable
$connectionString = "Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_40"

#Assigning the variable to one of the databases
$Analysis_Server.Databases[0].datasources[0].ConnectionString = $connectionString

#Remember to update the new configuration back to the database
$Analysis_Server.Databases[0].datasources[0].Update()

#Getting the new configuration
PS C:\Users\Administrator> $Analysis_Server.Databases | ForEach-Object {$_.datasources | ForEach-Object {$_.ConnectionSt
ring}}
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_40
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_2
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_1
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_6
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_3
Provider=SQLNCLI11.1;Data Source=AX2012R2A;Integrated Security=SSPI;Initial Catalog=DatabaseName_5

Обратите внимание на первую запись в каждом списке. Он изменился с имя_базы_данных_4 до имя_базы_данных_40

Таким образом вы изменяете только детали строки подключения, используя PowerShell и SMO.

...