Databricks读取Azure Synapse报主密钥错误但写入正常该如何排查
问题结论
不存在数据库主密钥仅限制读操作、不限制写操作的情况,该问题是Synapse读写场景下触发主密钥校验的逻辑不同导致的。
为什么写操作正常、读操作报错
- 写流程:Databricks Synapse连接器会先把待写入数据以Parquet格式写入指定的ADLS临时目录,再触发Synapse的COPY命令直接加载数据到表,整个过程不需要调用数据库主密钥加密/解密凭据,不会触发主密钥校验。
- 读流程:你调用
display(x)触发计算时,连接器会先要求Synapse把查询结果导出到ADLS临时目录,这个导出操作需要Synapse用数据库主密钥加密存储你传入的ADLS访问凭据,因此会触发主密钥校验。
可能的故障原因及修复方案
主密钥未绑定服务主密钥
多数场景下用户仅执行了CREATE MASTER KEY ENCRYPTION BY PASSWORD = '自定义密码'命令创建主密钥,但Synapse专用SQL池要求数据库主密钥必须由服务主密钥自动解密,否则会话默认不会打开主密钥。
验证方法:在执行读操作前,先运行Synapse命令OPEN MASTER KEY DECRYPTION BY PASSWORD = '创建主密钥时设置的密码',如果后续读操作正常即可确认是该问题。
修复方法:执行命令ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY,后续会话会自动打开主密钥,无需手动调用。JDBC连接账号无主密钥访问权限
写操作不需要访问主密钥元数据,但读操作的导出逻辑要求你sqlDwUrl中使用的连接账号,拥有目标数据库主密钥的VIEW DEFINITION权限,权限不足就会触发报错。
修复方法:用Synapse管理员账号执行命令GRANT VIEW DEFINITION ON MASTER KEY TO [你的连接账号名]。主密钥创建数据库与查询数据库不一致
如果你把主密钥创建在了master系统库,而实际查询的是自定义用户库,那么用户库没有对应的主密钥就会触发报错。
修复方法:切换到你实际查询的目标数据库,重新执行主密钥创建命令。
内容的提问来源于stack exchange,提问作者halfwind22
相关产品推荐
相关产品推荐

