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

Azure SQL Server多库登录失败:同账号仅Airflow可连接

解决Azure SQL登录失败(错误18456)的方案

1. 检查业务数据库的用户权限

Airflow能连接成功,说明账号在Airflow数据库上有合法权限,但6个业务库可能未配置该账号的访问权限。

  • 用Azure SQL管理员账号登录,对每个业务库执行以下SQL:
    USE [目标业务库名称];
    -- 如果该库下没有此用户,先创建
    IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = 'X')
    BEGIN
        CREATE USER [X] FOR LOGIN [X];
    END
    -- 授予读写权限,按需调整
    ALTER ROLE db_datareader ADD MEMBER [X];
    ALTER ROLE db_datawriter ADD MEMBER [X];
    

2. 修复密码特殊字符的转义问题

密码包含;和$,这两个字符在ODBC连接字符串中属于特殊字符,直接使用会导致密码被截断或解析错误。Airflow的连接字符串用URL格式自动处理了编码,而业务代码的ODBC直连格式需要手动编码:

  • 修改业务代码的连接字符串构造逻辑:
    import urllib.parse
    import os
    from sqlalchemy import create_engine
    
    # 从环境变量获取参数
    server = os.getenv("DB_SERVER")
    database = os.getenv("DB_NAME")
    username = os.getenv("DB_USER")
    password = os.getenv("DB_PASSWORD")
    
    # 对密码进行URL编码,处理特殊字符
    encoded_pwd = urllib.parse.quote_plus(password)
    # 构造ODBC连接字符串
    connect_str = f'Driver={{ODBC Driver 18 for SQL Server}};Server={server};Database={database};ENCRYPT=yes;UID={username};PWD={encoded_pwd};TrustServerCertificate=yes'
    # 对整个连接字符串再次编码(可选,但更稳妥)
    encoded_connect_str = urllib.parse.quote_plus(connect_str)
    # 创建引擎
    engine = create_engine(f"mssql+pyodbc:///?odbc_connect={encoded_connect_str}")
    

3. 验证容器IP的防火墙权限

虽然Airflow容器能连接,但业务容器的出口IP可能未被Azure SQL防火墙允许:

  • 登录Azure Portal,进入目标SQL服务器→防火墙和虚拟网络
  • 检查是否添加了业务容器所在VM的公网IP,或者临时开启“允许Azure服务和资源访问此服务器”进行测试(测试后关闭,保障安全)

4. 确认身份验证模式与账号类型

  • 检查Azure SQL服务器的身份验证模式:进入SQL服务器→设置→身份验证,确认已启用SQL身份验证,且账号X是SQL登录账号(而非Azure AD账号)

5. 排查变量替换是否正确

  • 在业务代码中添加日志(注意掩码密码),打印最终生成的connect_str,确认server、database、username、password是否正确替换为环境变量的值,避免出现变量未替换或拼写错误的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:13:37