Как изменить только строку подключения?

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

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, но он не будет работать с точки зрения сценария, который я пытаюсь выполнить, потому что у меня не может быть того же источника данных для других баз данных, которые есть на сервере. все они, возможно, разные, поэтому необходимо удалить идентификатор, имя и т. д. из XML-запроса в сценарии PowerShell.

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

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


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

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


person Cataster    schedule 09.11.2018    source источник
comment
Я бы сказал, что вам нужно сначала найти способ получить XML. Затем вы можете создать действительный измененный XML и отправить его обратно на сервер.   -  person Mötz    schedule 10.11.2018
comment
Я использую мобильный телефон, извините за то, что не смог проверить это. Но посмотрите на это и посмотрите, сможете ли вы получить все подробности об источнике данных: mobile.databasejournal.com/features/mssql/   -  person Mötz    schedule 10.11.2018
comment
@ Mötz: да, именно в этом мне нужна помощь, найти способ окончательно изменить XML-файл, будь то извлечение его или аннотирование, как в сценарии. Что касается предложенного вами потока, я пробовал invokeASCmd, например: $ cs = ConnectionTimeout = 60; UserId = someID; Password = pass; DataSource = td.domain.com; Persist Security Info = True; Session Character Set = UTF8 Import- Csv $ CSV_file | ForEach-Object {Invoke-ASCmd -Server $ _. Server -Database $ _. Cube -ConnectionString $ cs .... но я получил ошибку: Invoke-ASCmd: набор параметров не может быть разрешен с использованием указанных именованных параметров   -  person Cataster    schedule 10.11.2018
comment
Вы меня немного смущаете в деталях. Я поставил ответ на ваш другой вопрос. Давайте поговорим об этом.   -  person Mötz    schedule 10.11.2018
comment
@ Mötz Я говорил, что пробовал это: Invoke-ASCmd -Server $ _. Server -Database $ _. Cube -ConnectionString ConnectionTimeout = 60; UserId = someID; Password = pass; DataSource = td.domain.com; Persist Security Info = True; Набор символов сеанса = UTF8 ..... но я получил ошибку: Invoke-ASCmd: набор параметров не может быть разрешен с использованием указанных именованных параметров   -  person Cataster    schedule 10.11.2018


Ответы (2)


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

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

Если вы программируете для табличных моделей с уровнем совместимости 1200 или выше, используйте Табличную объектную модель (TOM). TOM - это расширение клиентской библиотеки объектов управления службами Analysis Services (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)
person Mötz    schedule 11.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

Обратите внимание на первую запись в каждом списке. Он изменился с DatabaseName_4 на DatabaseName_40.

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

person Mötz    schedule 10.11.2018
comment
работает для баз данных уровня совместимости 1103! наконец, но это не работает для баз данных с уровнем 1400. Я получаю эту ошибку: свойство ConnectionString не может быть найдено для этого объекта. Убедитесь, что свойство существует и может быть установлено. .... что это за свойство тогда для такого уровня? отличается ли он от сервера SQL 2017 года? - person Cataster; 11.11.2018
comment
Я не могу, так как у меня нет баз данных такого уровня. даже у меня были базы данных уровня 1200, мне все еще нужно, чтобы они работали на уровне 1400 (SQL Server 2017), однако есть кое-что важное, на что следует обратить внимание: очевидно, базы данных SQL Server 2012 SP1 или более поздней версии (1103), когда я пытаюсь изменить соединение как скрипт в SSMS, он отображается как файл XML (XMLA). однако для баз данных с SQL Server 2017 (1400) он не изменяется, а вместо этого заменяется на и генерирует файл JSON! - person Cataster; 11.11.2018
comment
Я считаю, что вам нужно внимательно прочитать эту ссылку docs.microsoft.com/en-us/bi-reference/amo/ - person Mötz; 11.11.2018
comment
ага! Если вы программируете для табличных моделей с уровнем совместимости 1200 или выше, используйте Табличную объектную модель (TOM). - person Cataster; 11.11.2018
comment
И здесь кто-то показывает, как это сделать в PowerShell stackoverflow.com/questions/47202008/ - person Mötz; 11.11.2018
comment
Позвольте нам продолжить это обсуждение в чате. - person Mötz; 11.11.2018
comment
$ svr.databases.model.datasources.ConnectionString - person Mötz; 11.11.2018
comment
теперь, если я попытаюсь обновить: ..... $ svr.databases [1] .model.datasources [0] .ConnectionString = $ newConnectionString ............... $ svr.Databases [ 1] .model.datasources [0] .Update () ........... Я получаю это ............. Вызов метода завершился неудачно, потому что [Microsoft.AnalysisServices.Tabular .ProviderDataSource] не содержит метода с именем 'Update' ........ и если я сделаю это: $ svr.Databases [1] .model.datasources [0] .Update (Microsoft.AnalysisServices.UpdateO‌ ptions .ExpandFull) Неожиданный токен Microsoft.AnalysisServices.UpdateOptions.ExpandFull в выражении или инструкции. - person Cataster; 11.11.2018
comment
$ svr.Databases [1] .model.Update (). - person Mötz; 11.11.2018
comment
При получении обновления члена возникло следующее исключение: обнаружен недопустимый тип для значения по умолчанию. + FullyQualifiedErrorId: CatchFromBaseGetMember - person Cataster; 11.11.2018
comment
даже попробовав метод SaveChanges (), я получил ту же ошибку .... я не понимаю почему, потому что docs.microsoft.com/en-us/bi-reference/tom/ .... говорит .. ..Чтобы зафиксировать изменения на сервере, вызовите либо Model.SaveChanges (), либо Database.Update (UpdateOptions.ExpandFull). - person Cataster; 11.11.2018