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
相关产品推荐
相关产品推荐

