通过R/RJDBC连接Snowflake时出现无法获取JDBC结果集报错问题
问题解决方案
你遇到的能通过dbListTables(con)查看表列表但无法查询的问题,可按以下步骤排查解决:
- 指定完整表限定名/设置默认Schema
你当前JDBC连接仅指定了默认数据库dwh_db,未指定默认Schema,dbListTables会返回所有你有权限的Schema下的表,但直接写表名查询时,Snowflake会默认在当前会话的默认Schema下查找对象,找不到就会报错。
解决方法三选一:- 查询时写全三层限定名,示例:
dbGetQuery(con, " SELECT * FROM dwh_db.你的Schema名称.FACT_VISIT LIMIT 10 " )- 在JDBC连接URL中新增Schema参数,在原有URL末尾加
&schema=你的Schema名称即可,后续查询无需再指定Schema。 - 执行查询前先切换到对应Schema:
dbSendUpdate(con, "USE SCHEMA 你的Schema名称;") - 核对表名大小写
Snowflake默认会将无引号包裹的SQL标识符转为大写处理,如果你的表是用带引号的小写/混合大小写名称创建的,直接写FACT_VISIT会匹配不到。你可以先查看dbListTables(con)返回的FACT_VISIT实际大小写格式,查询时和返回的名称保持一致,特殊大小写的表名需要用双引号包裹。 - 验证当前会话权限与参数
先执行以下语句确认当前会话的配置是否符合预期:
确认返回的角色是dbGetQuery(con, "SELECT CURRENT_DATABASE(), CURRENT_SCHEMA(), CURRENT_ROLE(), CURRENT_WAREHOUSE();")prod_readonly、数据库是dwh_db,如果参数异常可以重新调整连接URL配置。
如果参数无异常,可联系Snowflake管理员确认prod_readonly角色是否有目标表所在Schema的USAGE权限,以及目标表的SELECT权限。 - 排查标识符引用配置
你初始化JDBC驱动时设置了identifier.quote = ""`,如果查询语句中需要用到标识符包裹,注意和该配置保持一致,避免引号不匹配导致的对象识别错误。
内容的提问来源于stack exchange,提问作者Sweepy Dodo
相关产品推荐
相关产品推荐

