Сравнения списка объектов SQL Server в PowerShell на примере сравнения логинов на двух серверах

Источник: msmvps

В данном примере я покажу как с помощью PowerShell можно сравнивать списки объектов на двух серверах на примере сравнения логинов: поиск одинаковых, поиск разницы. Для этого сначала выполним подключение к серверам. В данном примере первый сервер - локальный. К нему будем подключаться с использованием Windows аутентификации.
Второй сервер - удаленный, к нему будем подключаться с использованием аутентификации SQL Server и запросом на ввод логина и пароля при подключении.

    #1. Загружаем SMO

    [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo ") / Out-Null

    #2. Подключаемся к серверу 1 (Windows аутентификация):
    #Сервер1-локальный
    #Если нужен другой сервер, введите вместо точки IP-адрес \ имя сервера

    $smoserver1 =new-object("Microsoft.SqlServer.Management.Smo.Server") "."

    #3. Подключаемся к Серверу 2 (аутентификация SQL Server):
    #В следующей строке нужно вписать IP-адрес сервера 2 либо имя сервера

    $smoserver2 =new-object("Microsoft.SqlServer.Management.Smo.Server") "IP - адрес \ имя сервера2"

    #Если аутентификация SQL Server, то значение FALSE, если Windows(по умолчанию) - TRUE

    $smoServer2.ConnectionContext.set_LoginSecure($FALSE)

    #Запрос ввода имени пользователя и пароля

    $LoginCredentials = Get-Credential

    #Устанавливаем свойства ConnectionContext

    $smoServer2.ConnectionContext.set_EncryptConnection($FALSE)

    #В конце поста я расскажу зачем в строке ниже убираем слеш из имени пользователя

    $smoServer2.ConnectionContext.set_Login($LoginCredentials.UserName -replace("\"))
    $smoServer2.ConnectionContext.set_SecurePassword($LoginCredentials.Password)

    #4. Сравниваем логины
    #Командлет выводит логины, которые есть на обоих серверах

    compare-object -referenceobject $($smoserver1.logins) -differenceobject $($smoserver2.logins) -includeequal / where-object {$_.SideIndicator -eq "=="} /select-object InputObject

    #Командлет выводит логины, которые есть на сервере 2, но нет на сервере 1

    compare-object -referenceobject $($smoserver1.logins) -differenceobject $($smoserver2.logins) / where-object {$_.SideIndicator -eq "=>"} /select-object InputObject

    #Командлет выводит логины, которые есть на сервере 1, но нет на сервере 2

    compare-object -referenceobject $($smoserver1.logins) -differenceobject $($smoserver2.logins) / where-object {$_.SideIndicator -eq "<="} /select-object InputObject

    #Можно перенаправить вывод в файл

    compare-object -referenceobject $($smoserver1.logins) -differenceobject $($smoserver2.logins) -includeequal / where-object {$_.SideIndicator -eq "=="} /select-object InputObject > C:\Test.txt

По тому же принципу можно сравнивать списки и других объектов сервера, например заданий.

    #Для того, чтобы сравнить список заданий на двух серверах, можно воспользоваться
    #объектом SMOServer.JobServer.Jobs:

    compare-object -referenceobject $($smoserver1.JobServer.Jobs) -differenceobject $($smoserver2. JobServer.Jobs)

Для получения справки по командлету compare-object, в окне powershell введите:

    Get-help Compare-object -detailed

Иерархия объектов SMO приведена в документации по адресу: http://msdn.microsoft.com/ru-ru/library/ms162209.aspx

Теперь о том, почему мы убираем слеш из введенного имени пользователя (...-replace("\")...).

Командлет get-credential ждет ввода в формате Домен\Логин. В нашем примере мы используем его не для входа в домен, а для подключения к SQL Server и домен не вводим, поэтому, несмотря на то, что в окне запроса учетных данных я вводила логин "Inaumova", свойству UserName присвоилось значение "\Inaumova". Это показано на рисунках ниже. Поэтому слеш нужно удалить.


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=22916