Как использовать ApplicationIntent = ReadOnly в моем коде powershell в команде SQL - PullRequest
1 голос
/ 02 апреля 2019

Мне нужно использовать ApplicationIntent = ReadOnly с моей командой SQL в powershell, которая подключается к базе данных реплики. Кто-нибудь может помочь?

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

$SQLQuery = "SELECT x.SCode, x.DatabaseName FROM dbo.Logins x ORDER BY x.SCode"
$auth = @{Username = $SQLUserName; Password = $SQLAdminPassword}

try
{
    $allTenants = Invoke-Sqlcmd -Query $SQLQuery -ServerInstance $SQLServerName -Database 'SShared'-QueryTimeout -0 @Auth -ErrorAction Stop
    Write-Log -LogFileName $logfile -LogEntry ("Found {0} tenants" -f $allTenants.Count)
}

Я получаю приведенную ниже ошибку, используя это -

Сообщение об исключении Ошибка, связанная с сетью или экземпляром произошла при установлении соединения с SQL Server

Сервер не был найден или не был доступен. Убедитесь, что имя экземпляра правильное и что SQL Server настроен на удаленные подключения. (поставщик: поставщик именованных каналов, ошибка: 40 - Не удалось открыть соединение с SQL Server)

1 Ответ

0 голосов
/ 03 апреля 2019

Есть несколько способов сделать это.

Простой способ

dbatools

Существует модуль PowerShell для взаимодействия с SQL Server, созданный сообществом SQL Server.называется dbatools.В модуле есть функция с именем Invoke-DbaQuery, которая по сути является оберткой для Invoke-Sqlcmd.

Эта функция имеет параметр -ReadOnly, который можно использовать, который был создан именно для этого сценария.

# Changing your $auth to a PSCredential object.
$cred = [System.Management.Automation.PSCredential]::New(
    $SqlUserName,
    (ConvertTo-SecureString -String $SqlAdminPassword -AsPlainText -Force))

# Splatting the parameters for read-ability.
$QueryParams = @{
    Query = $SQLQuery
    SqlInstance = $SQLServerName
    Database = 'SShared'
    QueryTimeout = 0
    SqlCredential = $cred
    ReadOnly = $true # <-- Specifying read-only intent.
    ErrorAction = 'Stop'
}
$allTenants = Invoke-DbaQuery @QueryParams

Другой способ

Invoke-Sqlcmd

Если вы не можете, не хотите, не хотите использовать dbatools, вы все равно можете использовать Invoke-Sqlcmd.Последний выпуск на момент написания имеет возможность указать параметр -ConnectionString.

Вы можете указать, что он доступен только для чтения.

# Splatting again for read-ability.
$SqlcmdParams = @{
    Query = $SQLQuery
    QueryTimeout = 0
    ConnectionString = "Data Source=$SQLServerName;Initial Catalog=SShared;User ID=$SqlUserName;Password=$SqlAdminPassword;Integrated Security=false;ApplicationIntent=ReadOnly" # <-- Specifying read-only intent.
    ErrorAction = 'Stop'
}
Invoke-Sqlcmd @SqlcmdParams
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...