2015-03-24 4 views
21

Есть ли простой способ проверить подключение к экземпляру MS SQL Server от клиента (без загрузки каких-либо сборок SQL) с помощью PowerShell?Связь с тестовой базой данных

MS Sql: Servername \ Instance порт 1433

Как я могу проверить связь с сервером с помощью PowerShell от обычного клиента?

ответ

29

Используйте SqlConnection class для проверки соединения. Вам не нужно загружать любые сборки SQL.

Вспомогательная функция:

function Test-SQLConnection 
{  
    [OutputType([bool])] 
    Param 
    (
     [Parameter(Mandatory=$true, 
        ValueFromPipelineByPropertyName=$true, 
        Position=0)] 
     $ConnectionString 
    ) 
    try 
    { 
     $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $ConnectionString; 
     $sqlConnection.Open(); 
     $sqlConnection.Close(); 

     return $true; 
    } 
    catch 
    { 
     return $false; 
    } 
} 

Пример использования:

Test-SQLConnection "Data Source=localhost;database=myDB;User ID=myUser;Password=myPassword;" 
+0

Возврат '$ _. Exception.Message' в область catch для получения сообщения об ошибке. –

+0

@PawBaltzersen Хорошая точка, но командлет явно возвращает логическое значение, потому что он предназначен для возврата true или false, прошел ли тест успешно или нет. Большинство пользователей, вероятно, не заботятся о фактическом сбое теста. –

+0

Я знаю, просто подумал, что я упомянул об этом :) –

4

Это зависит от того, что вы на самом деле хотите, чтобы проверить. Если вы просто хотите, чтобы убедиться, что вы можете подключиться к порту на удаленном хосте что-то вроде этого будет делать:

$server = 'servername' 
$port = 1433 

$tcp = New-Object Net.Sockets.TcpClient 
if ([void]$tcp.Connect($server, $port)) { 
    'connected' 
} else { 
    'not connected' 
} 
$tcp.Dispose() 

Если вы хотите, чтобы убедиться, что подключение к экземпляру SQL Server может быть установлен вас» будет нужно что-то вроде этого:

$dbhost = 'servername' 
$dbinst = 'instance' 
$dbname = 'master' 

$username = ... 
$password = ... 

$cs = "Server=$dbhost\$dbinst;Database=$dbname;User Id=$username;" + 
     "Password=$password;" 

$cn = New-Object -COM 'ADODB.Connection' 
$cn.ConnectionString = $cs 
try { 
    $cn.Open() 
    if ($cn.State -eq 1) { 
    'connected' 
    $cn.Close() 
    } else { 
    'not connected' 
    } 
} catch { 
    'not connected' 
} 
+4

В Windows 8.1 и Server 2012 R2 вы также можете использовать командлет Test-NetConnection следующим образом: Test-NetConnection -ComputerName 'servername' -Port 1433 –

8

Это в основном так же, как ответ Мартина, только строка соединения строить из параметров, а также время, необходимое для подключения измеряется.

например:

Test-SQLDatabase -Server SQLServer -Database SomeDB -Username SQLUser -Password password 

или

Test-SQLDatabase -Server Server1\SQLExpress -Database SomeDB -UseWindowsAuthentication 

.

function Test-SQLDatabase 
{ 
    param( 
    [Parameter(Position=0, Mandatory=$True, ValueFromPipeline=$True)] [string] $Server, 
    [Parameter(Position=1, Mandatory=$True)] [string] $Database, 
    [Parameter(Position=2, Mandatory=$True, ParameterSetName="SQLAuth")] [string] $Username, 
    [Parameter(Position=3, Mandatory=$True, ParameterSetName="SQLAuth")] [string] $Password, 
    [Parameter(Position=2, Mandatory=$True, ParameterSetName="WindowsAuth")] [switch] $UseWindowsAuthentication 
    ) 

    # connect to the database, then immediatly close the connection. If an exception occurrs it indicates the conneciton was not successful. 
    process { 
     $dbConnection = New-Object System.Data.SqlClient.SqlConnection 
     if (!$UseWindowsAuthentication) { 
      $dbConnection.ConnectionString = "Data Source=$Server; uid=$Username; pwd=$Password; Database=$Database;Integrated Security=False" 
      $authentication = "SQL ($Username)" 
     } 
     else { 
      $dbConnection.ConnectionString = "Data Source=$Server; Database=$Database;Integrated Security=True;" 
      $authentication = "Windows ($env:USERNAME)" 
     } 
     try { 
      $connectionTime = measure-command {$dbConnection.Open()} 
      $Result = @{ 
       Connection = "Successful" 
       ElapsedTime = $connectionTime.TotalSeconds 
       Server = $Server 
       Database = $Database 
       User = $authentication} 
     } 
     # exceptions will be raised if the database connection failed. 
     catch { 
       $Result = @{ 
       Connection = "Failed" 
       ElapsedTime = $connectionTime.TotalSeconds 
       Server = $Server 
       Database = $Database 
       User = $authentication} 
     } 
     Finally{ 
      # close the database connection 
      $dbConnection.Close() 
      #return the results as an object 
      $outputObject = New-Object -Property $Result -TypeName psobject 
      write-output $outputObject 
     } 
    } 
} 
Смежные вопросы