Azure SQL查询外部表触发ODBC Driver 17的46833错误如何解决
问题根因
执行Azure SQL弹性查询返回Msg 46833且远端提示Invalid object name,核心原因是弹性查询路由到远端数据库后,无法定位到指定的目标表对象,常见触发场景如下:
- 外部表定义的远端对象映射错误:未指定远端表所属schema(默认仅查找dbo schema下的对象)、表名拼写错误、大小写与远端实际表名不匹配(大小写敏感排序规则场景下会触发匹配失败)
- 外部数据源配置错误:填写的远端服务器地址、数据库名有误,实际连接到的库中不存在目标表
- 数据库范围凭据权限不足:外部数据源绑定的凭据对应的远端账号,没有目标表的访问权限,部分场景下权限不足会直接抛出对象无效报错而非显式权限报错
- 远端对象变更:本地创建外部表后,远端的目标表被删除、重命名、迁移到其他schema,导致本地映射失效
- 分片映射配置错误:如果使用分片式弹性查询,分片映射管理器的路由规则配置错误,请求被转发到了不存在目标表的分片库
排查与修复步骤
- 校验外部表映射配置
在本地库执行以下语句,查询已创建的外部表的远端映射配置,逐项核对远端schema名、表名是否和远端实际对象完全一致:
SELECT name AS local_external_table_name, SCHEMA_NAME(schema_id) AS local_table_schema, remote_schema_name, remote_object_name FROM sys.external_tables;
如果映射配置错误,可删除后重建外部表,或通过ALTER EXTERNAL TABLE语句修正远端对象映射参数,注意非dbo schema的远端表必须显式指定remote_schema_name,不可省略。
- 校验外部数据源与凭据有效性
在本地库执行以下语句查询外部数据源配置,核对location字段中的远端服务器地址、目标数据库名是否配置正确:
SELECT name AS external_data_source_name, location, credential_id FROM sys.external_data_sources;
找到该数据源绑定的数据库范围凭据对应的账号,单独使用该账号登录远端目标数据库,直接执行针对目标表的SELECT查询,确认可以正常连通远端库、且有目标表的查询权限。如果权限不足,在远端库执行以下语句授权即可:
-- 远端库执行 GRANT SELECT ON [目标schema名].[目标表名] TO [凭据对应账号名];
校验远端对象状态
登录远端目标数据库,检查目标表是否存在、是否被重命名、是否被迁移到其他schema,若有变动同步更新本地外部表的映射配置即可。分片场景专项排查
如果使用分片模式的弹性查询,检查分片映射管理器中的路由规则,确认查询请求被转发到的分片库中确实存在目标表,修正错误的分片映射配置。
内容的提问来源于stack exchange,提问作者Patrick Goode
相关产品推荐
相关产品推荐

