连接Azure SQL数据库时出现错误40532的排查求助
解决Azure SQL数据库PHP连接错误40532
我尝试使用以下PHP脚本连接我的Azure SQL数据库,但收到错误代码40532的提示。我已将自身IP地址添加至防火墙,且可以通过portal.azure.com登录并操作该SQL数据库,但脚本连接始终失败。我不确定尝试过的方法为何无效,怀疑是权限相关问题却无法定位,请问我哪里操作有误?
<?php // 调整重试逻辑的变量 $connectionTimeoutSeconds = 30; // 默认15秒在互联网环境下有时太短 $maxCountTriesConnectAndQuery = 3; // 可调整重试次数 $secondsBetweenRetries = 4; // 简单重试策略 $errNo = 0; $serverName = "sql-xxxx-xxxx-xxxxx.database.windows.net"; $connectionOptions = array("Database"=>"AdventureWorks", "Uid"=>"someone@somewhere.nl", "PWD"=>"itssecret", "LoginTimeout" => $connectionTimeoutSeconds); $conn = null; $arrayOfTransientErrors = array('08001', '08002', '08003', '08004', '08007', '08S01'); for ($cc = 1; $cc <= $maxCountTriesConnectAndQuery; $cc++) { // [A.2] 连接并执行查询命令 $conn = sqlsrv_connect($serverName, $connectionOptions); if ($conn === true) { echo "连接已建立"; echo "<br>"; $tsql = "SELECT Name FROM Production.ProductCategory"; $stmt = sqlsrv_query($conn, $tsql); if ($stmt === false) { echo "查询执行出错"; echo "<br>"; die(print_r(sqlsrv_errors(), true)); } while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { echo $row['Name'] . "<br/>" ; } sqlsrv_free_stmt($stmt); sqlsrv_close( $conn); break; } else { // [A.4] 检查错误码是否属于可重试的临时错误 $isTransientError = false; $errorCode = ''; if (($errors = sqlsrv_errors()) != null) { foreach ($errors as $error) { $errorCode = $error['code']; $isTransientError = in_array($errorCode, $arrayOfTransientErrors); if ($isTransientError) { break; } } } if (!$isTransientError) { // 持久化错误,终止程序 echo("遇到持久化错误,错误码 = $errorCode。程序将终止。"); echo "<br>"; exit(0); } // [A.6] 临时错误,准备重试 if ($cc >= $maxCountTriesConnectAndQuery) { echo "重试次数过多 - $cc次。程序将终止。"; echo "<br>"; exit(0); } echo("遇到临时错误,错误码 = $errorCode。程序将自动重试。"); echo "<br>"; echo "已尝试$cc次,即将重试。"; echo "<br>"; // 简单重试策略:暂停后重试 sleep(1*$secondsBetweenRetries); } // [A.3] 操作完成,程序结束 } ?>
排查与解决步骤
1. 修正SQL登录名格式
Azure SQL的SQL认证登录名必须为 [用户名]@[服务器短名称](服务器短名称即sql-xxxx-xxxx-xxxxx,不带.database.windows.net后缀)。你的代码中Uid使用了someone@somewhere.nl,格式错误,需改为对应服务器的登录格式,比如someone@sql-xxxx-xxxx-xxxxx。
同时确认该登录名:
- 已在Azure SQL服务器级别创建
- 已映射到
AdventureWorks数据库的用户 - 拥有至少
db_datareader权限(用于执行查询)
2. 完善连接参数
Azure SQL要求强制加密连接,需在connectionOptions中添加加密相关参数:
$connectionOptions = array( "Database"=>"AdventureWorks", "Uid"=>"someone@sql-xxxx-xxxx-xxxxx", "PWD"=>"itssecret", "LoginTimeout" => $connectionTimeoutSeconds, "Encrypt" => true, "TrustServerCertificate" => false );
若密码包含特殊字符,尝试用单引号包裹密码字符串,避免转义问题。
3. 验证网络连通性
错误40532表示连接被主动拒绝,除了防火墙规则:
- 测试本地网络是否允许访问1433端口(Azure SQL默认端口),执行命令:
telnet sql-xxxx-xxxx-xxxxx.database.windows.net 1433,若无法连通需检查本地防火墙或网络策略。 - 临时开启Azure SQL服务器的允许Azure服务和资源访问此服务器选项(门户防火墙设置中),排除NAT导致的IP识别问题。
4. 调整重试逻辑的错误码列表
40532可能是临时网络波动导致的,将其加入临时错误列表,让脚本自动重试:
$arrayOfTransientErrors = array('08001', '08002', '08003', '08004', '08007', '08S01', '40532');
内容的提问来源于stack exchange,提问作者Maurice Katzenbauer
相关产品推荐
相关产品推荐

