You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SqlConnection.Open调用失败但SSMS可正常连接的技术求助

解决SQL Server登录失败:仅SSMS可连接,代码/VS无法连接的问题

第一步:修正连接字符串的拼写错误

你的PowerShell代码中存在明显的拼写错误:ConnectrionString应为ConnectionString,这个错误会导致连接字符串未被正确赋值,程序使用默认参数尝试连接,必然失败。修正后的代码:

$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "data source=MyServer\MyDb,1234;initial catalog=MyDb;user id=someone;pwd=Password;"
$conn.Open();

若修正后仍报错,排查SQL Server配置问题

1. 检查登录账号的数据库映射与权限

  • 打开SSMS,连接目标服务器,展开安全性 > 登录名,找到someone账号,右键选择属性。
  • 切换到用户映射标签页:
    • 确认MyDb数据库已被勾选,且对应数据库用户已创建(通常与登录名同名)。
    • 确保该数据库用户至少拥有CONNECT权限,按需添加db_datareader/db_datawriter等权限。
  • 切换到常规标签页,确认默认数据库设置为MyDb(即使连接字符串指定了initial catalog,默认数据库不可访问也可能触发登录失败)。

2. 验证服务器级CONNECT权限

执行以下SQL语句,检查someone是否拥有服务器级别的CONNECT SQL权限:

USE master;
GO
SELECT name, permission_name, state_desc 
FROM sys.server_permissions sp
JOIN sys.server_principals spri ON sp.grantee_principal_id = spri.principal_id
WHERE spri.name = 'someone' AND permission_name = 'CONNECT SQL';

若未返回结果,执行授权语句:

GRANT CONNECT SQL TO someone;
GO

3. 排查登录触发器限制

服务器可能存在登录触发器,限制someone仅能从SSMS登录。执行以下语句查看所有服务器级触发器:

SELECT name, definition 
FROM sys.server_triggers 
WHERE parent_class_desc = 'SERVER';

检查触发器逻辑是否过滤了应用程序名称(如仅允许Microsoft SQL Server Management Studio),若存在此类限制,需修改触发器或为someone添加例外。

4. 启用登录审核获取详细错误信息

若以上步骤仍无法定位问题,可开启登录审核获取更精准的失败原因:

  • 在SSMS中右键目标服务器,选择属性 > 安全性。
  • 在登录审核中选择失败的登录,确定后重启SQL Server服务。
  • 再次尝试代码连接,然后查看管理 > SQL Server日志,找到对应失败记录,根据错误状态码(如18456的不同状态)定位具体问题(状态28=密码错误,状态38=数据库不可访问,状态40=登录被禁用等)。

内容的提问来源于stack exchange,提问作者AracKnight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:13:12