使用含@的用户名通过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
相关产品推荐
相关产品推荐

