ODBC查询SQL Server sysobjects无法返回用户自定义对象求助
问题描述
我通过ODBC对多个SQL Server 2019数据库执行以下查询:
SELECT * FROM sysobjects WHERE type = 'P' ORDER BY name
其中一个数据库执行该查询时,仅返回系统存储过程,无法获取用户自定义对象;移除type = 'P'条件后,也仅返回系统对象(无用户自定义表、视图或存储过程)。但使用同一SQL Server登录用户在SSMS中执行相同查询,可正常返回所有用户自定义对象。
该登录用户在所有数据库中的有效权限如下:
CONNECT SELECT VIEW ANY COLUMN ENCRYPTION KEY DEFINITION VIEW ANY COLUMN MASTER KEY DEFINITION VIEW DATABASE STATE VIEW DEFINITION
所有ODBC数据源配置一致,但问题仍存在,求排查建议。
排查建议
检查ODBC连接的默认数据库
确认异常数据库对应的ODBC数据源,是否在配置时将默认数据库设置成了master或其他系统库,而非目标业务库。SSMS登录时通常会自动切换到用户默认数据库,但ODBC如果显式指定了默认库,会导致查询跑在错误的库上,自然只能看到系统对象。排查查询中的数据库上下文
执行查询时,是否显式指定了目标数据库?比如是否应该写成SELECT * FROM [目标库名].dbo.sysobjects?如果ODBC连接后没有切换到目标库,而用户的默认数据库不是该业务库,就会查询当前连接的默认库内容。验证ODBC驱动版本
确认异常数据源使用的ODBC驱动版本,是否与其他正常数据源一致。SQL Server 2019建议使用ODBC Driver 17 for SQL Server或更高版本,旧版本驱动可能存在系统视图兼容性问题,导致无法正确读取用户对象元数据。改用现代系统视图测试
sysobjects是兼容旧版本的视图,在多架构环境下可能存在显示限制。建议改用更现代的系统视图测试,比如:SELECT * FROM sys.procedures ORDER BY name; SELECT * FROM sys.tables ORDER BY name;这类视图能更准确地展示全架构下的用户自定义对象。
检查数据库的
TRUSTWORTHY属性
如果该数据库是从其他实例还原的,可能TRUSTWORTHY属性被禁用,导致用户权限无法正确映射到数据库对象。可以执行以下语句检查并开启:SELECT is_trustworthy_on FROM sys.databases WHERE name = '目标库名'; -- 若返回0,执行开启语句(需高权限) ALTER DATABASE [目标库名] SET TRUSTWORTHY ON;验证ODBC连接参数
检查ODBC数据源的“应用程序名称”配置项,是否与其他正常连接不同;同时确认连接字符串中是否存在ApplicationIntent=ReadOnly等特殊参数,这类参数可能导致只读上下文下无法读取部分元数据。
内容的提问来源于stack exchange,提问作者babycarrier

