部署到Shinyapps.io时无法连接Azure SQL的问题求助
你收到的错误核心是FreeTDS驱动无法解析你传入的数据库服务器主机名,不是驱动版本或者Azure不兼容的问题,按以下步骤排查即可:
1. 优先排查配置读取问题
你使用config::get读取连接参数,首先确认两个点:
- 你的
config.yml配置文件是否被纳入部署清单?如果该文件被加入了.gitignore或者.rdeployignore,线上环境读取不到配置,conn_args$server会为空或者取到错误值,直接导致主机名解析失败 - 你是否为config配置了多环境?默认
config::get()只会读取default分组的配置,如果你的生产环境配置放在production分组,需要改成config::get("dataconnection", config = "production")才能正确读取线上配置
你可以在连接代码前增加一行日志确认参数是否正确:
message(paste("线上环境读取的Server地址:", conn_args$server))
部署后查看日志,确认打印的Server地址和你本地使用的完全一致。
2. 修正FreeTDS连接参数
你当前的线上连接参数缺少必填项,且Server格式需要适配FreeTDS规则:
- 移除Server地址的
tcp:前缀:Windows的ODBC驱动支持带tcp:前缀的服务器地址,但FreeTDS会把前缀当成主机名的一部分,直接解析失败。直接使用纯域名格式即可,比如xxx.database.windows.net - 增加
Encrypt = "yes"参数:Azure SQL强制要求加密连接,你注释掉的旧代码里有这个参数,但新的odbc连接代码里遗漏了 - TDS版本固定为7.4即可,不需要测试其他版本,7.4完全兼容所有现有Azure SQL实例
修正后的线上连接代码参考:
con <- odbc::dbConnect( odbc::odbc(), Driver = "FreeTDS", Server = gsub("^tcp:", "", conn_args$server), # 自动移除多余的tcp前缀 Database = conn_args$database, UID = conn_args$uid, PWD = conn_args$pwd, Port = 1433, Encrypt = "yes", TrustServerCertificate = "no", TDS_Version = 7.4, timeout = 30 )
3. 确认Azure侧配置
即使你临时开放了所有IP,也需要确认Azure SQL服务器的允许Azure服务和资源访问此服务器开关已打开,该开关在Azure门户的SQL服务器网络配置页面下。
4. 备选方案:不用config包,直接使用shinyapps.io环境变量
如果排查后确认是config包读取问题,可以直接在shinyapps.io控制台的应用设置页,找到「环境变量」配置项,把server、database、uid、pwd四个参数直接配置为环境变量,线上环境直接用Sys.getenv()读取:
con <- odbc::dbConnect( odbc::odbc(), Driver = "FreeTDS", Server = Sys.getenv("DB_SERVER"), Database = Sys.getenv("DB_NAME"), UID = Sys.getenv("DB_UID"), PWD = Sys.getenv("DB_PWD"), Port = 1433, Encrypt = "yes", TrustServerCertificate = "no", TDS_Version = 7.4 )
这种方式不需要打包配置文件,安全性也更高。
Azure SQL和Shinyapps.io本身完全兼容,社区有大量成熟案例,按上述步骤排查即可解决问题。
内容的提问来源于stack exchange,提问作者FreyGeospatial
相关产品推荐
相关产品推荐

