为什么使用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
相关产品推荐
相关产品推荐

