求助:无法使用SQL管理员凭据查询Azure Synapse无服务器SQL池中的视图
我来帮你搞定这个问题!你遇到的核心矛盾是:SQL管理员账户默认没有访问Azure Data Lake Storage (ADLS)的权限,而且你之前尝试授权的WorkspaceSystemIdentity并不是数据库范围凭据——它是Synapse工作区的托管标识,这就是你执行授权语句报错的原因。下面是一步步的解决方案:
1. 确认Synapse工作区托管标识的ADLS权限
首先要确保Synapse工作区的托管标识(也就是你提到的WorkspaceSystemIdentity)在ADLS的devicetelemetry容器上拥有Storage Blob Data Reader权限(如果需要写入操作可以选Contributor)。这一步是基础,因为我们后续要通过这个托管标识让SQL管理员间接访问ADLS。
2. 创建关联托管标识的数据库范围凭据
在视图所在的数据库中,创建一个数据库范围凭据,把它和Synapse工作区的托管标识绑定:
CREATE DATABASE SCOPED CREDENTIAL WorkspaceIdentityCredential WITH IDENTITY = 'Managed Identity';
这里不需要设置SECRET,因为托管标识的凭据不需要密钥,SQL会自动关联工作区的托管标识。
3. 修改视图,指定使用这个凭据
原来的视图没有指定访问ADLS的凭据,所以默认会用当前查询用户的权限(SQL管理员没有ADLS权限,因此报错)。现在修改视图,让它使用我们刚创建的凭据:
ALTER VIEW DeviceTelemetryView AS SELECT corporationid, deviceid, version, Convert(datetime, dateTimestamp, 126) AS dateTimeStamp, deviceData FROM OPENROWSET( BULK 'https://test123.dfs.core.windows.net/devicetelemetry/*/*/*/*/*/', FORMAT = 'PARQUET', CREDENTIAL = [WorkspaceIdentityCredential] -- 新增这一行,指定凭据 ) AS [result] GO
4. 给SQL管理员授予凭据的引用权限
现在这个数据库范围凭据已经存在了,给你的SQL管理员账户授予引用它的权限:
GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[WorkspaceIdentityCredential] TO [sqlAdmin];
验证效果
完成以上步骤后,用你的SQL管理员账户重新查询DeviceTelemetryView,应该就能正常返回数据了!
为什么之前的方法失败?
WorkspaceSystemIdentity是Synapse工作区层面的托管标识,不是数据库内的数据库范围凭据对象,所以你执行GRANT REFERENCES时会提示找不到它。我们需要在数据库内创建一个映射到该托管标识的凭据,才能让SQL管理员通过这个凭据间接获取ADLS的访问权限。
内容的提问来源于stack exchange,提问作者Josh L

