为何无法从Azure Data Studio或Databricks查询Synapse无服务器视图
问题根因说明
该报错的核心原因是SQL身份验证模式下,Synapse无服务器SQL池无法默认继承UI操作时的AAD存储访问权限:你原来的OPENROWSET写法默认会使用当前登录用户的身份做存储鉴权,AAD登录时你的账号本身有ADLS存储的Blob数据读取权限,所以可以正常访问;而SQL登录用户没有关联ADLS的访问凭据,也没有AAD身份,因此触发权限报错。
UI界面看不到视图的问题也是因为SQL登录用户没有对应数据库的元数据查看权限,和存储鉴权是两个独立的权限问题。
修复步骤
1. 创建数据库主密钥和存储访问凭据
首先在你创建视图的对应Synapse数据库中执行以下语句,创建关联ADLS的数据库范围凭据:
-- 第一步:创建数据库主密钥(如果当前库还未创建) CREATE MASTER KEY ENCRYPTION BY PASSWORD = '自定义的强加密密码'; -- 第二步:创建关联ADLS存储的数据库范围凭据 CREATE DATABASE SCOPED CREDENTIAL AdlsStockCred WITH -- 若使用存储账户密钥鉴权,IDENTITY填存储账户名,SECRET填存储账户密钥 IDENTITY = 'SHARED ACCESS SIGNATURE', -- SECRET填ADLS存储的SAS令牌,注意需要去掉SAS字符串开头的?符号 SECRET = '你的ADLS存储SAS令牌' ;
2. 调整视图创建语句,显式指定凭据
修改原来的视图创建逻辑,在OPENROWSET中指定上一步创建的凭据,让所有访问视图的用户统一用该凭据做存储鉴权:
CREATE or alter view stock as SELECT * FROM OPENROWSET( BULK 'https://tesdvsrc18732.dfs.core.windows.net/adlse-fr/be_stock/', FORMAT = 'DELTA', CREDENTIAL = 'AdlsStockCred' -- 新增该行指定存储凭据 ) AS [result]
3. 给SQL登录用户分配必要权限
执行以下授权语句,让SQL登录用户可以正常查看和查询视图:
-- 授予SQL用户数据库连接权限 GRANT CONNECT TO [你的SQL登录用户名]; -- 授予SQL用户视图查询权限 GRANT SELECT ON stock TO [你的SQL登录用户名]; -- 授予SQL用户存储凭据的使用权限 GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::AdlsStockCred TO [你的SQL登录用户名]; -- 授予SQL用户元数据查看权限,即可在UI中看到视图 GRANT VIEW DEFINITION TO [你的SQL登录用户名];
4. Databricks端访问适配
Databricks无法直接识别Synapse无服务器SQL池的OPENROWSET视图,你可以直接在Databricks中读取Delta存储路径访问数据:
# PySpark示例,提前给Databricks集群配置ADLS访问权限后直接读取 df = spark.read.format("delta").load("abfss://adlse-fr@tesdvsrc18732.dfs.core.windows.net/be_stock/") df.show()
注意事项
- 生产环境建议使用有效期可控的SAS令牌作为凭据密钥,不要长期使用存储账户全权限密钥
- 若需要更精细化的权限管控,可以将凭据关联有存储访问权限的服务主体,避免权限过度分配
内容的提问来源于stack exchange,提问作者OrganicMustard
相关产品推荐
相关产品推荐

