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

Synapse Notebook删除Serverless SQL Pool视图失败及TokenLibrary报错问题

解决方案

问题1:Spark JDBC执行DROP VIEW报错

spark.read.jdbc() 是专门用于**读取数据(DQL)**的API,无法执行DDL/DML语句(比如DROP VIEW这类操作)。要执行DDL,可换用以下两种方式:

方式1:通过Spark SQL执行DDL

先通过JDBC连接创建临时视图,再用spark.sql()执行删除命令:

server = 'REDACTED'
Port = 1433
Database = "REDACTED"
jdbcUrl = f"jdbc:sqlserver://{server}:{Port};databaseName={Database};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30"
token = TokenLibrary.getConnectionString("LinkTest")
conn_Prop = {
    "driver" : "com.microsoft.sqlserver.jdbc.SQLServerDriver",
    "accessToken" : token
}

# 创建临时视图(仅用于建立连接,可指定任意系统表)
spark.read.jdbc(url=jdbcUrl, table="sys.tables", properties=conn_Prop).createOrReplaceTempView("dummy")

# 执行DROP VIEW命令
spark.sql(f"DROP VIEW dbo.TransformationTest")

方式2:直接用JDBC驱动执行DDL

通过Py4J调用Java JDBC驱动直接执行语句:

from py4j.java_gateway import java_import

# 导入JDBC相关类
java_import(spark._jvm, "java.sql.DriverManager")

server = 'REDACTED'
Port = 1433
Database = "REDACTED"
jdbcUrl = f"jdbc:sqlserver://{server}:{Port};databaseName={Database};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30"
token = TokenLibrary.getConnectionString("LinkTest")

# 获取Java连接并设置Token
conn = spark._jvm.DriverManager.getConnection(jdbcUrl, "", "")
conn.setClientInfo("AccessToken", token)

# 执行DDL
stmt = conn.createStatement()
stmt.execute("DROP VIEW dbo.TransformationTest")

# 关闭资源
stmt.close()
conn.close()

问题2:PyODBC中TokenLibrary未定义

TokenLibrary是Azure Synapse专属库,需手动导入;另外你的连接字符串用了ActiveDirectoryMsi,可直接用MSI认证无需手动取token,修正后代码如下:

修正后的PyODBC代码

%pip install pyodbc
import pyodbc
from azure.synapse.tokenlibrary import TokenLibrary

server = 'REDACTED'
Port = 1433
Database = "REDACTED"

# 方式1:直接用MSI认证(无需TokenLibrary)
conn_str = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server},{Port};DATABASE={Database};Authentication=ActiveDirectoryMsi'

# 方式2:若必须用TokenLibrary取token,用此连接字符串
# token = TokenLibrary.getAccessToken("https://database.windows.net/")
# conn_str = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server},{Port};DATABASE={Database};UID=AnyString;PWD={token}'

# 执行删除操作
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
cursor.execute("DROP VIEW dbo.TransformationTest")
conn.commit()
cursor.close()
conn.close()

额外注意事项

  • 确保Spark池拥有访问Serverless SQL Pool的权限,且账号具备删除视图的权限(如db_ddladmin角色)。
  • 使用TokenLibrary时必须导入from azure.synapse.tokenlibrary import TokenLibrary,否则会触发NameError。
  • 确认Spark池环境已安装ODBC驱动,%pip install pyodbc需执行成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:03:26