解决连接错误的先决条件和清单 - SQL Server

解决连接错误的先决条件和清单 - SQL Server

请确保 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 , ping -a 如果发现任何问题,请与网络管理员合作。 或者,可以在 PowerShell 中使用 Test-NetConnection :

$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的方法中的脚本。

🖌️ 相关文章

博美狗狗为什么害怕吉他呢
365bet足球网投

博美狗狗为什么害怕吉他呢

📅 10-09 👁️ 5208
win11如何关闭开机密码
Bet体育365提款要多久2022

win11如何关闭开机密码

📅 07-15 👁️ 9099
汉字“虑”的起源、演变过程
365bet足球网投

汉字“虑”的起源、演变过程

📅 08-27 👁️ 7749