PHP测试脚本无法连接SQL Server的问题排查与解决求助
SQL Server 连接失败排查与解决(PHP sqlsrv)
测试脚本
我编写了以下PHP测试脚本验证SQL Server数据库连接:
<?php $serverName = "ABC-XXXXXXX"; $uid = "my_user"; $pwd = "my_password"; $databaseName = "my_database"; $connectionInfo = array("UID"=>$uid, "PWD"=>$pwd, "Database"=>$databaseName); $conn = sqlsrv_connect( $serverName, $connectionInfo); var_dump($conn);
初始排查方向
连接失败,初步推测原因:
$serverName配置错误- 用户权限不足
获取$serverName的步骤(通过SSMS)
- 打开对象资源管理器
- 右键目标数据库,选择「属性」
- 左侧栏点击「查看连接属性」
- 取「服务器环境」区域的「计算机名称」值作为
$serverName
权限配置尝试
通过SSMS操作+执行以下SQL语句授予用户权限:
USE [my_database]; GRANT SELECT, UPDATE, INSERT, DELETE ON SCHEMA :: [dbo] TO my_user;
执行成功后,在SSMS中确认用户对dbo架构的增删改查权限已勾选,但不确定是否遗漏其他权限。
环境信息:Web服务器为IIS,操作系统Windows 10。
错误排查与更新
更新1:打印错误信息
调用sqlsrv_errors()得到错误:Login failed for user 'my_user'
更新2:修改身份验证模式
将「服务器身份验证」设置为「SQL Server和Windows身份验证模式」后,新错误:Cannot open database "my_database" requested by the login. The login failed.
更新3:授予连接数据库权限
在「安全性>登录名>my_user>属性>安全对象」中勾选「连接任意数据库」后,错误变为:The SELECT permission was denied on the object 'block_content', database 'my_database', schema 'dbo'.
更新4:添加到服务器角色
将用户添加到sysadmin服务器角色后,测试脚本成功连接,不确定此前操作是否有辅助作用。
总结与优化建议
- 从错误流程来看,权限及身份验证配置是核心问题:
- 初始登录失败:SQL Server未启用SQL Server和Windows身份验证模式(混合模式),导致SQL登录账户无法使用
- 数据库无法打开:登录账户
my_user没有访问my_database的权限 - 对象权限被拒绝:即使给了dbo架构的增删改查权限,可能存在对象级的显式拒绝,或架构权限未覆盖到具体对象
- 不建议直接添加到sysadmin服务器角色,这会赋予过高的系统权限,存在安全风险。更安全的最小权限配置方案:
- 首先确保登录账户
my_user在my_database中存在对应的数据库用户:USE [my_database]; CREATE USER [my_user] FOR LOGIN [my_user]; - 授予数据库用户对目标对象的必要权限,比如针对
block_content表:USE [my_database]; GRANT SELECT, UPDATE, INSERT, DELETE ON [dbo].[block_content] TO [my_user]; - 如果需要对整个dbo架构下的所有对象生效,可授予架构级的控制权限(避免遗漏单个对象):
USE [my_database]; -- 取消可能存在的显式拒绝权限 REVOKE SELECT ON [dbo].[block_content] TO [my_user]; -- 授予dbo架构的控制权限 GRANT CONTROL ON SCHEMA :: [dbo] TO [my_user];
- 首先确保登录账户
内容的提问来源于stack exchange,提问作者arnoldbird
相关产品推荐
相关产品推荐

