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

连接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:22:03