请确保 SQL Server 已启动,并在 SQL Server 错误日志中看到以下消息:
SQL Server 已做好进行客户端连接的准备。 这只是一条信息性消息,不需要用户执行任何操作。
在 PowerShell 中使用以下命令检查系统上 SQL Server 服务的状态:
Get-Service | Where {$_.status -eq 'running' -and $_.DisplayName -match "sql server*"}
使用以下命令搜索特定字符串的错误日志文件“SQL Server 现已准备好进行客户端连接。 这是一条信息性消息;无需执行任何用户操作。”:
Get-ChildItem -Path "c:\program files\microsoft sql server\mssql*" -Recurse -Include Errorlog |select-string "SQL Server is now ready for client connections."
验证通过 IP 地址建立的基本连接并检查是否存在任何异常: ping -a
$servername = "DestinationServer"
Test-NetConnection -ComputerName $servername
通过查看错误日志来检查 SQL Server 是否侦听正确的协议:
Get-ChildItem -Path "c:\program files\microsoft sql server\mssql*" -Recurse -Include Errorlog |select-string "Server is listening on" , "ready to accept connection on" -AllMatches
检查是否能够使用 UDL 文件连接到 SQL Server。 如果有效,则连接字符串可能存在问题。 有关 UDL 测试过程的说明,请参阅 使用 UDL 文件测试 OLE DB 与 SQL Server 的连接。 或者,可以使用以下脚本创建和启动 UDL-Test.udl 文件(存储在 %TEMP% 文件夹中):
clear
$ServerName = "(local)"
$UDL_String = "[oledb]`r`n; Everything after this line is an OLE DB initstring`r`nProvider=MSOLEDBSQL.1;Integrated Security=SSPI;Persist Security Info=False;User ID=`"`";Initial Catalog=`"`";Data Source=" + $ServerName + ";Initial File Name=`"`";Server SPN=`"`";Authentication=`"`";Access Token=`"`""
Set-Content -Path ($env:temp + "\UDL-Test.udl") -Value $UDL_String -Encoding Unicode
#open the UDL
Invoke-Expression ($env:temp + "\UDL-Test.udl")
检查是否可以从其他客户端系统和不同的用户登录名连接到 SQL Server。 如果可以的话,问题可能特定于遇到问题的客户端或登录。 检查有问题的客户端上的 Windows 事件日志以获取更多指针。 此外,请检查网络驱动程序是否是最新的。
如果遇到登录失败,请确保存在一个登录名(服务器主体),并且它拥有对 SQL Server 的CONNECT SQL权限。 此外,请确保分配给登录名的默认数据库正确,并且映射的数据库主体对数据库具有 CONNECT 权限。 有关如何向数据库主体授予 CONNECT 权限的详细信息,请参阅 GRANT 数据库权限。 有关如何向服务器主体授予 CONNECT SQL 权限的详细信息,请参阅 GRANT 服务器权限。 使用以下脚本来帮助你识别这些权限:
clear
## replace these variables with the login, user, database and server
$server_principal = "CONTOSO\JaneK"
$database_principal = "JaneK"
$database_name = "mydb"
$server_name = "myserver"
Write-Host "`n******* Server Principal (login) permissions *******`n`n"
sqlcmd -E -S $server_name -Q ("set nocount on; SELECT convert(varchar(32),pr.type_desc) as login_type, convert(varchar(32), pr.name) as login_name, is_disabled,
convert(varchar(32), isnull (pe.state_desc, 'No permission statements')) AS state_desc,
convert(varchar(32), isnull (pe.permission_name, 'No permission statements')) AS permission_name,
convert(varchar(32), default_database_name) as default_db_name
FROM sys.server_principals AS pr
LEFT OUTER JOIN sys.server_permissions AS pe
ON pr.principal_id = pe.grantee_principal_id
WHERE is_fixed_role = 0 -- Remove for SQL Server 2008
and name = '" + $server_principal + "'")
Write-Host "`n******* Database Principal (user) permissions *******`n`n"
sqlcmd -E -S $server_name -d $database_name -Q ("set nocount on; SELECT convert(varchar(32),pr.type_desc) as user_type, convert(varchar(32),pr.name) as user_name,
convert(varchar(32), isnull (pe.state_desc, 'No permission statements')) AS state_desc,
convert(varchar(32), isnull (pe.permission_name, 'No permission statements')) AS permission_name
FROM sys.database_principals AS pr
LEFT OUTER JOIN sys.database_permissions AS pe
ON pr.principal_id = pe.grantee_principal_id
WHERE pr.is_fixed_role = 0
and name = '" + $database_principal + "'")
Write-Host "`n******* Server to Database Principal mapping ********`n"
sqlcmd -E -S $server_name -d $database_name -Q ("exec sp_helplogins '" + $server_principal + "'")
如果要排查 Kerberos 相关问题,可以使用确定身份验证类型是否为 Kerberos的方法中的脚本。