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

Azure Synapse执行OPENROWSET遇CosmosDB密钥未Base64编码错误求助

解决Azure Synapse无服务器池访问CosmosDB时的“Secret is not base64 encoded”错误

问题场景

使用sqlcmd向Azure Synapse无服务器池部署查询,已执行以下语句创建访问CosmosDB的数据库范围凭据:

CREATE DATABASE SCOPED CREDENTIAL [mycosmos] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<accessKeyToCosmosAccount>'

随后通过OPENROWSET查询CosmosDB数据:

SELECT TOP (100) *
from OPENROWSET (
    PROVIDER = 'CosmosDB',
    CONNECTION = 'Account=mycosmos;Database=reporting;',
    OBJECT = 'data',
    CREDENTIAL = 'mycosmos'
) as o;

执行时触发错误:Resolving CosmosDB path has failed with error 'Secret is not base64 encoded.',已通过SELECT * FROM SYS.database_scoped_credentials确认凭据存在,且尝试用echo $mysecret | tr -d '\n\r' | base64 -w 0编码密钥但问题仍存在。

排查与解决建议

  • 检查SAS令牌格式
    确保使用的是CosmosDB账户级SAS令牌,而非容器级令牌。令牌需包含sv、ss、sr、sp等必要参数,且开头不能带?。例如正确格式:sv=2021-06-08&ss=bfqt&srt=sco&sp=rwdlacupi&se=2024-12-31T23:59:59Z&st=2024-01-01T00:00:00Z&spr=https&sig=xxxxxx,若有开头的?需删除后再编码。

  • 重新执行严谨的Base64编码
    避免编码时混入额外换行符,使用如下命令确保仅编码令牌本身:

    echo -n "$mysecret" | base64 -w 0
    

    编码后直接复制结果作为SECRET的值,不要手动添加任何字符。

  • 重建数据库范围凭据
    若之前的凭据存在格式问题,先删除再重建:

    DROP DATABASE SCOPED CREDENTIAL IF EXISTS [mycosmos];
    CREATE DATABASE SCOPED CREDENTIAL [mycosmos] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 'base64编码后的SAS令牌';
    

    注意SECRET值直接使用编码后的字符串,无需额外引号或转义。

  • 验证SAS令牌权限与有效期
    确认SAS令牌拥有至少read权限(sp=r),且生效时间(st)、过期时间(se)覆盖当前时间。可通过Azure门户生成新的合规SAS令牌,重新编码后测试。

  • 修正OPENROWSET的CONNECTION参数
    确保Account为CosmosDB账户的完整域名(如mycosmos.documents.azure.com),完整CONNECTION字符串示例:

    CONNECTION = 'Account=mycosmos.documents.azure.com;Database=reporting;'
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:50:26