【问题标题】:Not getting list of tables from database没有从数据库中获取表列表
【发布时间】:2019-04-25 03:05:13
【问题描述】:

我正在尝试获取当前 Oracle 用户拥有的表的列表。我在 oracle 中创建了用户,其中我有以下 2 个表:

  • 类别

  • 地址

现在,当我在 oracle 中运行以下查询时,我只得到了我想要的 2 个表:

SELECT table_name FROM user_tables;

上述查询参考:https://www.arungudelli.com/tutorial/oracle/list-all-tables-in-oracle-query/

但问题是当我尝试使用GetSchema 方法获取表列表时,我什么也得不到:

public Datatable GetTables(DbConnection conn)
        {
              conn.Open();
              if (conn.State == ConnectionState.Open)
              {
                    var tables = conn.GetSchema("Tables", new string[] { "user_tables" });
              }
              conn.Close();
        }

现在当我喜欢下面的时候,我得到了不必要的表(> 1000),它们是系统表和其他表(虽然我只有类别和地址表,但不知道它们来自哪里):

var tables = conn.GetSchema("Tables");

所以我只想获取当前Oracle用户拥有的表列表。下面是我的连接字符串:

data source="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyService)))";user id=C##Db1;password=root123;

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您的用户是否拥有这些表?
  • @LachlanLindsay 是的,正如我在问题中提到的,类别和地址表是用户在连接字符串中提到的唯一表
  • 通过c#代码访问数据库时,“当前”用户是谁?似乎应用程序以用户 SYSDBA 或其他一些管理员帐户的身份连接到数据库(这就是您获得数千个表的原因)。如果应用程序以 SYSDBA 身份连接,Oracle 数据库应该如何知道您想要某些特定用户的表?
  • @mathguy 通过连接字符串?因为连接字符串有关于用户的信息。不是吗?

标签: c# oracle ado.net oracle12c


【解决方案1】:

取自微软关于GetSchema(String, String[])的文档

如果“Tables”集合具有三个限制——数据库、所有者和表名——并且您只想获取与所有者“Carl”关联的表,则需要传入以下值:null ,“卡尔”。如果没有传入限制值,则默认值用于该限制。这与传入 null 的映射相同,与传入参数值的空字符串不同。在这种情况下,空字符串 ("") 被认为是指定参数的值。

您可以阅读更多here

【讨论】:

  • 所以我想要达到的目标是不可能的?
  • 其实可以: String[] tableRestrictions = new String[4]; // 对于数组,0-member 代表 Catalog; 1-member 代表 Schema; // 2-member 代表表名; 3-member 代表表类型。在你的情况下,它应该是 new string[] { null, "your_your", "user_tables" }
  • your_youuser 是什么?因为我没有固定连接字符串。我正在从数据库中读取连接字符串
  • 您的建议出现错误:Schema 'Tables' 不支持超过 '2' 的限制
  • 抱歉打错了。 your_user 应该是表的所有者。至于您收到的错误,我建议您只使用 2 个限制,new string[] { "Owner_of_table", "user_tables" } 看看它会把你带到哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 2010-09-13
相关资源
最近更新 更多