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

使用含@的用户名通过TinyTds连接Azure SQL数据库遇问题

解决TinyTds连接Azure SQL时用户名被错误解析的问题

我之前用TinyTds连接Azure SQL的时候也踩过这个坑,看你的情况,大概率是Azure AD格式的用户名(firstname.lastname@company.onmicrosoft.com)和TinyTds的azure: true参数冲突了——这个参数会自动尝试把用户名拼接成用户名@服务器名的格式,结果把你的Azure AD UPN和服务器域名叠在一起,导致用户名被错误解析。

给你两个可行的解决办法:

方法一:移除azure: true,手动配置加密和TDS版本

有时候azure: true的自动适配反而添乱,不如手动指定连接所需的关键参数,避免用户名被错误拼接:

#!/usr/bin/env ruby
require 'tiny_tds'

server = 'xxx.database.windows.net'
database = 'yyysqldb03'
username = 'firstname.lastname@company.onmicrosoft.com'
password = 'zzzz'

client = TinyTds::Client.new(
  username: username,
  password: password,
  host: server,
  port: 1433,
  database: database,
  tds_version: '7.4', # 推荐用7.3或更高版本,适配Azure SQL
  encryption: 'strict', # Azure SQL强制要求加密连接
  login_timeout: 30
)

# 测试连接是否成功
if client.active?
  puts "连接成功!"
  result = client.execute("SELECT DB_NAME() AS CurrentDatabase")
  puts "当前数据库: #{result.first['CurrentDatabase']}"
else
  puts "连接失败: #{client.error_message}"
end

方法二:调整用户名格式,适配azure: true的自动拼接

如果你一定要保留azure: true参数,那可以提前把用户名改成AzureAD用户名@服务器短名称的格式——这里的服务器短名称就是你Azure SQL服务器地址里database.windows.net前面的部分(比如xxx.database.windows.net里的xxx):

#!/usr/bin/env ruby
require 'tiny_tds'

server = 'xxx.database.windows.net'
database = 'yyysqldb03'
# 注意这里的用户名格式:AzureAD UPN + @ + 服务器短名称
username = 'firstname.lastname@company.onmicrosoft.com@xxx'
password = 'zzzz'

client = TinyTds::Client.new(
  username: username,
  password: password,
  host: server,
  port: 1433,
  database: database,
  azure: true
)

另外还要提醒你两个关键点:

  • 确认你的Azure AD账号已经被授权访问目标数据库(比如在数据库里创建了对应的DB用户,或者账号拥有db_datareader之类的角色)
  • 检查Azure SQL服务器的防火墙规则,确保你的IP地址被允许连接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:15:37