【问题标题】:Oracle views userOracle 查看用户
【发布时间】:2011-09-28 19:11:00
【问题描述】:

现在我已经了解了 Oracle 中模式对象的概念以及匹配表名时的顺序。

对于用户 XYZ 发出并访问 FOO_TABLE 的 sql 查询,优先顺序是检查

  1. 用户表:XYZ.FOO_TABLE
  2. 用户同义词:XYZ.FOO_TABLE
  3. 公共同义词:PUBLIC.FOO_TABLE

查看 XML 中视图的以下数据:

<ROW>
    <OWNER>XYZ</OWNER>
    <VIEW_NAME>BAR_VIEW</VIEW_NAME>
    <TEXT_LENGTH>...</TEXT_LENGTH>
    <TEXT>
        SELECT *
        FROM SOME_NAME
    </TEXT>
    <EDITIONING_VIEW>N</EDITIONING_VIEW>
    <READ_ONLY>N</READ_ONLY>
</ROW>

如果我想找到 SOME_TABLE 的所有者,我可以直接看下面的顺序吗?

  1. 用户表:XYZ.SOME_NAME
  2. 用户同义词:XYZ.SOME_NAME
  3. 公共同义词:PUBLIC.SOME_NAME

最好, 会

【问题讨论】:

    标签: oracle object schema


    【解决方案1】:

    您的陈述实际上可以简化为:

    1. 用户对象:XYZ.SOME_TABLE
    2. 公共同义词:PUBLIC.SOME_TABLE

    此规则适用于所有数据库对象(表、包等)。不需要本地同义词步骤,因为 1) 它是本地对象,并且 2) Oracle 不允许本地对象之间发生名称冲突(即,您不能在同名模式中拥有同义词和表)。

    这里唯一的限定符是,如果视图定义包含架构 (SELECT * FROM SOME_SCHEMA.SOME_TABLE) 或数据库链接 (SELECT * FROM SOME_TABLE@SOME_DB_LINK),则名称解析是从指定的架构完成的(如果是 DB 链接,则从数据库链接定义中指示的架构)。

    【讨论】:

    • 哦,我想我记错了。将 SOME_TABLE 替换为 SOME_NAME。现在我们需要完成所有 3 个步骤,对吗?
    • @Will:不。在本地模式中,您将拥有同义词或具有该名称的某个对象,而不会两者兼有。如果有同义词,它将显示在 [dba/all/user]_objects 中。描述额外的步骤并没有错,只是没有必要。您实际上并没有跳过本地同义词,它只是在第一步中封装。
    • 对,我是在假设我有一个 XML 转储每个 dba_tables(还有 dba_views)和 dba_synonyms 而没有一个 dba_objects 的情况下问的。然后我猜实际上需要额外的步骤。但是公共表呢?
    • @Will:我说的是严格的技术角度,而不是实现角度。如果您更喜欢使用 DBA_TABLES 和 DBA_SYNONYMS,那么您需要检查两者的本地模式。另外,回答您的问题:假设您的意思是公共同义词,它们将在 dba_synonyms 和 dba_objects 中显示为属于“公共”模式的同义词。
    猜你喜欢
    • 2018-03-02
    • 1970-01-01
    • 2017-10-10
    • 2013-11-19
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多