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

能否使用tedious-connection-pool通过azure-active-directory-msi-app-service连接Azure AD SQL Server

解决方案

问题根因

你遇到的报错本质是tedious-connection-pool这个第三方包已经多年未更新,没有适配tedious后续新增的Azure AD托管身份认证逻辑,只会默认读取userName和password配置字段,当你用MSI认证时没有配置这两个字段,就会出现空用户的登录失败错误。

替代方案

建议直接使用tedious官方内置的连接池功能,从tedious v14开始官方已经原生支持连接池,完全适配所有Azure AD认证方式,不需要依赖第三方的tedious-connection-pool包。

可运行示例代码

const { ConnectionPool, Request } = require('tedious');

// 连接池配置
const poolConfig = {
  min: 2,
  max: 4,
  log: true
};

// 连接配置
const connectionConfig = {
  server: '你的SQL服务器地址,格式为xxx.database.windows.net',
  authentication: {
    type: 'azure-active-directory-msi-app-service',
    options: {
      clientId: '你的托管身份客户端ID'
    }
  },
  options: {
    database: '你的数据库名',
    encrypt: true,
    port: 1433
  }
};

// 初始化官方连接池
const pool = new ConnectionPool(poolConfig, connectionConfig);

// 监听连接池错误
pool.on('error', (err) => {
  console.error('连接池错误:', err);
});

// 连接池就绪后执行查询
pool.acquire().then(connection => {
  const request = new Request('select * from Users', (err, rowCount) => {
    if (err) {
      console.error('查询错误:', err);
      connection.release();
      return;
    }
    console.log('查询到的行数:', rowCount);
    // 释放连接回连接池
    connection.release();
  });

  // 处理返回的行数据
  request.on('row', (columns) => {
    console.log('行数据:', columns.map(col => col.value));
  });

  // 执行SQL
  connection.execSql(request);
}).catch(err => {
  console.error('获取连接失败:', err);
});

前置检查项

  • 确认你使用的tedious版本 >= 14.0.0,可执行npm list tedious查看版本
  • 确认Azure SQL服务器已经为你使用的托管身份开通了对应数据库的访问权限
  • 确认代码运行环境(App Service、Function等)已经启用了对应托管身份

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:36:04