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

无法连接Synapse Analytics的DataverseEnhanced视图及获取数据求助

解决方案

连接问题排查

  • 确认Synapse权限:在Synapse Studio的Manage -> Access control中,检查你的用户是否拥有SQL On-Demand Contributor权限,或直接在DataverseEnhanced数据库中分配db_datareader角色。
  • 验证ODBC驱动:确保本地安装的ODBC Driver 17 for SQL Server为最新版本,旧版本可能存在兼容性问题。
  • 核对连接参数:确认server是完整的On-Demand端点(格式:<工作区名>-ondemand.sql.azuresynapse.net),database名称严格匹配创建时的拼写(Azure SQL数据库名称默认不区分大小写,但建议完全一致)。

权限替代方案(无需执行GRANT语句)

  • 手动分配权限:在Synapse Studio中打开DataverseEnhanced数据库,右键点击dbo架构,选择Permissions,添加你的用户并分配SELECT权限。
  • 使用Azure AD认证:修改连接字符串为Azure AD密码认证模式,利用Azure AD权限体系管理访问:
    connection_string = f"DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password};Authentication=ActiveDirectoryPassword"
    
  • 托管身份访问(适用于Azure服务运行代码):为运行Python的Azure服务配置托管身份,在Synapse中给该身份分配数据库读取权限,无需硬编码用户名密码。

视图有效性验证

  • 在Synapse Studio的SQL脚本窗口执行以下语句,确认视图存在且可访问:
    SELECT * FROM DataverseEnhanced.dbo.account
    
  • 检查视图定义,确认其指向的基表权限正常:
    sp_helptext 'DataverseEnhanced.dbo.account'
    

代码优化建议

添加错误捕获并明确指定架构,便于定位问题:

import pyodbc

server = '**********-ondemand.sql.azuresynapse.net'
database = 'DataverseEnhanced'
username = '********'
password = '*********'   
driver= '{ODBC Driver 17 for SQL Server}'

def main():
    try:
        connection_string = f"DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}"
        with pyodbc.connect(connection_string) as conn:
            with conn.cursor() as cursor:
                # 验证当前连接的数据库
                cursor.execute("SELECT DB_NAME()")
                print(f"当前连接数据库: {cursor.fetchone()[0]}")
                
                # 检查account视图是否存在
                cursor.execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'account' AND TABLE_SCHEMA = 'dbo'")
                if not cursor.fetchone():
                    print("错误:DataverseEnhanced.dbo.account视图不存在")
                    return
                
                # 查询少量数据测试
                query = 'SELECT TOP 10 * FROM dbo.account'
                cursor.execute(query)
                results = cursor.fetchall()
                print(f"成功获取{len(results)}条数据")
                for row in results[:3]:  # 只打印前3条
                    print(row)
                    
    except pyodbc.Error as e:
        print(f"数据库连接/查询错误: {e}")
    except Exception as e:
        print(f"其他错误: {e}")
            
if __name__ == "__main__":
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:45:23