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

PHP连接MS SQL数据库报错SQL state 37000求助

解决MS SQL ODBC连接报错:Cannot open database requested by the login

这个报错SQL state 37000加上提示的"无法打开请求的数据库,登录失败",核心问题很明确:你的只读账号在DBA调整设置后,失去了目标数据库dbname的访问权限,或者账号的默认数据库配置被修改了。结合你的情况,我给你几个针对性的排查和修复方向:

1. 确认账号是否拥有目标数据库的只读权限

让DBA执行下面的SQL语句,检查你的账号是否还在dbname的db_datareader角色里(这是只读账号访问数据库的核心权限):

USE dbname;
SELECT * FROM sys.database_role_members 
WHERE role_principal_id = (SELECT principal_id FROM sys.database_principals WHERE name = 'db_datareader')
AND member_principal_id = (SELECT principal_id FROM sys.database_principals WHERE name = '你的只读账号名');

如果查询结果为空,说明DBA调整账号时意外移除了这个权限,只需要让他们重新把你的账号加入db_datareader角色即可。

2. 检查账号的默认数据库设置

有时候DBA修改账号时,可能把你的账号默认数据库改成了其他你没有权限的库,导致连接时默认尝试访问错误的数据库。让DBA执行这条SQL查看配置:

SELECT name, default_database_name FROM sys.server_principals WHERE name = '你的只读账号名';

如果default_database_name不是dbname,或者是一个你无权访问的数据库,就让DBA修改回来:

ALTER LOGIN '你的只读账号名' WITH DEFAULT_DATABASE = dbname;

3. 快速验证连接字符串的正确性

虽然你说之前运行正常,但也可以顺手核对下odbc_connect的连接字符串,确保数据库名称拼写完全一致(注意MS SQL在区分大小写的排序规则下,名称大小写会影响访问):

// 对比你的代码,确认Database参数的正确性
$conn = odbc_connect("Driver={SQL Server};Server=你的服务器地址;Database=dbname;UID=你的账号;PWD=你的密码;", "", "");

检查Database=后面的名称有没有多余空格、拼写错误。

4. 排除数据库本身的状态问题

极端情况是dbname数据库被设置为离线、正在还原状态,这种情况下即使有权限也无法访问。让DBA执行这条SQL确认数据库状态:

SELECT name, state_desc FROM sys.databases WHERE name = 'dbname';

如果state_desc不是ONLINE,需要先恢复数据库的可用状态。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:58:48