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

为什么使用System.Data.SqlClient无法获取SQL Server数据库表名?

问题定位步骤

  • 优先核对两类操作的登录凭据:你登录Azure Data Studio用的账号,和C#连接字符串里配置的账号大概率不是同一个。通常Azure Data Studio会用个人高权限账号(如域账号、数据库管理员账号)登录,而业务代码的连接字符串会用单独分配的低权限服务账号。
  • 用C#连接字符串里的账号重新登录Azure Data Studio,手动执行查系统表的SQL,此时会和代码中一样返回0行,即可排除代码问题,定位到权限原因。
  • 执行权限验证SQL确认权限缺失:用代码的连接账号执行SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW DEFINITION');,返回值为0就代表没有视图定义权限,就是问题的直接原因。

根因说明

你遇到的问题确实是连接字符串所用凭据的权限不足导致的:
SQL Server的系统视图(sys.tables、information_schema.tables、sysobjects)只会返回当前登录账号拥有查看权限的表的记录。你日常可以正常读写myRealTable,是因为DBA单独给这个账号分配了该表的增删改查权限,不影响业务操作,但这类权限不包含查看数据库所有表元数据的权限,所以查系统视图会返回空。

另外注意你的failingTablesQuery2中带了GO关键字,这个是Azure Data Studio/SSMS的客户端批处理分隔符,不属于SQL Server官方语法,在C#中执行时需要删掉GO,否则会直接抛出语法错误,这个小问题也可以同步修正。

解决方法

联系数据库管理员,给你代码所用的账号分配对应数据库的VIEW DEFINITION权限即可,执行的SQL参考如下:

USE 你的数据库名
GO
GRANT VIEW DEFINITION TO [你代码连接用的账号名]

如果不需要查看全库所有表的元数据,也可以单独给需要查询的表分配视图定义权限,权限粒度可以按需调整。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 12:57:01