【问题标题】:Oracle schema table name restrictionsOracle 模式表名限制
【发布时间】:2010-07-01 21:20:10
【问题描述】:

我正在研究在 Oracle 上使用 JBoss 5.1.0GA,并且已经看到 this,警告我应该明确说明应该在其中创建 TIMERS 表的架构名称,因为 Oracle 不允许这样做表名被使用两次,甚至跨模式。

读完后,我在 StackOverflow 上看到了this question,想了解一下 Oracle 中对象的层次结构。

假设我们有一个 Oracle 数据库服务器。在此,我们创建了两个数据库 - D1 和 D2。在每个数据库中,我们创建两个模式 - S1 和 S2。在每个数据库的每个模式中,我们创建一个表 - T1 到 T4:

+-D1
| +---S1
| |   +---T1
| +---S2
|     +---T2
+-D2
  +---S1
  |   +---T3
  +---S2
      +---T4

我是否正确地认为,如果我在 D1/S2 中添加另一个名为 T1 的表,它将不起作用,因为表名在模式中必须是唯一的,并且 T1 已经存在于 D1/S1 中,但是如果我添加T1 到 D2/S1 或 D2/S2 都可以,因为名为 T1 的两个表在不同的数据库中?

我有一种讨厌的感觉,我对 Oracle 模式的理解存在缺陷(它不是我以前经常使用的数据库),所以如果我问了愚蠢的问题,我很抱歉。

提前致谢

丰富

【问题讨论】:

    标签: sql oracle database-design


    【解决方案1】:

    Oracle 中不存在数据库层级:一个实例(一组进程)最多只能挂载一个数据库(一组文件)。在数据库中,您会发现与 Oracle 中的用户相同的模式。

    每个架构都有一个独立的命名空间,例如架构 S1S2 在同一个数据库中都可以有一个名为 T1 的表。您可以通过使用它们的所有者作为前缀来专门访问这些表:S1.T1S2.T1

    某些对象没有所有者(或者它们的所有者是 PUBLIC):例如,公共同义词和目录。显然,这些对象的名称在数据库中必须是唯一的。明智地使用公共同义词(我认为尽量少用)以避免名称冲突。

    【讨论】:

    • 那么 RedHat 网站上的评论(两个链接中的第一个)是什么意思呢?
    • @Rich: 也许timers 是一个公开的同义词?
    • "但是,如果您连接到数据库实例的用户可以访问这两个表,则现在访问其中一个表时需要小心。要明确引用特定模式中的表,请使用模式。桌子。” - 我认为这就是问题所在。来自stackoverflow.com/questions/1685775/…
    • 您可以在同一台服务器上运行多个实例 [但通常不建议这样做(可能测试/开发环境除外)]。这确实允许两个数据库在同一台服务器上运行。那样的话就完全独立了,彼此不知道。
    • @Gary 对不起,如果我误解了你,你的意思是 JBoss 或 Oracle 的多个实例吗?我假设你的意思是甲骨文。我认为我们很可能会采用一个 Oracle 服务器,每个 JBoss 实例都有一个架构(这些在其他机器上运行),每个 JBoss 实例都有一个用户。这样一来,特定实例应该访问哪个表就不会有歧义的风险。
    【解决方案2】:

    就 Oracle 而言,您可以在两个不同的模式中拥有相同的表名。您正在阅读的 JBoss 用法可能有一些特定的内容,但这不是 Oracle 的限制。

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 2020-04-28
      • 2018-11-13
      • 1970-01-01
      • 2020-09-30
      相关资源
      最近更新 更多