为什么我不能使用 System.Data.SqlClient 获取我的表的名称?
Why can I not get the names of my tables using System.Data.SqlClient?
我没有创建也不拥有此数据库。我的工作通常只是将数据放入其中,因此我不必过多考虑 DBA 方面的问题。我正在搞乱一个副项目,无法弄清楚为什么我不能列出所有 table 名称。我找到了几种收集此信息的方法,但 none 在 c# 上下文中对我有用。我每次都得到 0 行。它们在 azure data studio 中作为查询执行时确实有效。无论我使用哪种方法枚举 tables,我都会返回 99 行(tables 的正确数量)。我的连接字符串指定要在服务器内使用的数据库。
查询名为 workingQuery
returns 预期信息(1 行 15 个字段)。所以我知道我的连接字符串是正确的并且我的代码可以正常工作。
我有一个测试函数,我正在尝试对其进行多次查询。
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
List<string> fields = new List<string>();
string workingQuery = "SELECT TOP (1) * FROM myRealTable";
string failingTablesQuery1 = "SELECT name FROM sysobjects WHERE xtype = 'U'";
string failingTablesQuery2 = "SELECT name AS table_name FROM sys.tables GO";
string failingTablesQuery3 = "SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE = 'BASE TABLE'";
using (var command = conn.CreateCommand())
{
command.CommandText = workingQuery;
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
for (int i = 0; i < reader.FieldCount; i++)
{
fields.Add(reader[i].ToString());
}
conn.Close();
return fields;
}
}
除了原始 sql 查询外,我还尝试了 SqlConnection.GetSchema("Tables")。它还 returns 没有行。
我尝试在查询前面添加 USE myDatabaseName;
但没有效果。
我只能假设这是数据库设置方式的问题。谁能帮我找出导致此问题的原因?
解决方案:
我的连接字符串中的凭据没有执行此操作所需的权限。
在 SQL 服务器对元数据的访问由 VIEW DEFINITION 权限控制。您可能有权从 table 访问 SELECT,但无权查看其定义或在目录中发现它。默认情况下,对对象的任何权限都意味着 VIEW DEFINITION,但可以拒绝用户。参见 Metadata Visibility Configuration。
因此请检查您是否在两个地方使用相同的身份,并且该身份对 table 具有 VIEW DEFINITION 权限。
我没有创建也不拥有此数据库。我的工作通常只是将数据放入其中,因此我不必过多考虑 DBA 方面的问题。我正在搞乱一个副项目,无法弄清楚为什么我不能列出所有 table 名称。我找到了几种收集此信息的方法,但 none 在 c# 上下文中对我有用。我每次都得到 0 行。它们在 azure data studio 中作为查询执行时确实有效。无论我使用哪种方法枚举 tables,我都会返回 99 行(tables 的正确数量)。我的连接字符串指定要在服务器内使用的数据库。
查询名为 workingQuery
returns 预期信息(1 行 15 个字段)。所以我知道我的连接字符串是正确的并且我的代码可以正常工作。
我有一个测试函数,我正在尝试对其进行多次查询。
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
List<string> fields = new List<string>();
string workingQuery = "SELECT TOP (1) * FROM myRealTable";
string failingTablesQuery1 = "SELECT name FROM sysobjects WHERE xtype = 'U'";
string failingTablesQuery2 = "SELECT name AS table_name FROM sys.tables GO";
string failingTablesQuery3 = "SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE = 'BASE TABLE'";
using (var command = conn.CreateCommand())
{
command.CommandText = workingQuery;
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
for (int i = 0; i < reader.FieldCount; i++)
{
fields.Add(reader[i].ToString());
}
conn.Close();
return fields;
}
}
除了原始 sql 查询外,我还尝试了 SqlConnection.GetSchema("Tables")。它还 returns 没有行。
我尝试在查询前面添加 USE myDatabaseName;
但没有效果。
我只能假设这是数据库设置方式的问题。谁能帮我找出导致此问题的原因?
解决方案: 我的连接字符串中的凭据没有执行此操作所需的权限。
在 SQL 服务器对元数据的访问由 VIEW DEFINITION 权限控制。您可能有权从 table 访问 SELECT,但无权查看其定义或在目录中发现它。默认情况下,对对象的任何权限都意味着 VIEW DEFINITION,但可以拒绝用户。参见 Metadata Visibility Configuration。
因此请检查您是否在两个地方使用相同的身份,并且该身份对 table 具有 VIEW DEFINITION 权限。