【问题标题】:When to qualify the schema name of an object in Oracle何时在 Oracle 中限定对象的模式名称
【发布时间】:2011-10-27 06:05:05
【问题描述】:

什么决定了 Oracle 对象(表、视图等)是否需要使用模式名称(例如 schema.table_name 或 schema.view_name 等)进行限定?有时我可以访问远程对象(通过数据库链接)而无需限定模式,但有时,我收到一条错误消息,指出“表或视图不存在”,为了纠正这个问题,我必须限定模式名称。

我知道始终限定架构名称是一种最佳做法,但我只是好奇为什么我能够在没有限定架构的情况下访问某些远程对象,而只能通过限定架构访问其他对象。

【问题讨论】:

  • 正如您所指出的,最佳做法是使用模式名称进行限定。请注意,如果您不这样做,并且有人获得了深入的数据库访问权限,他们可能会劫持您的工作。例如,如果他们更改了同义词以使 DBMS_UTILITY 指向 MyBadSchema.DBMS_UTILITY 而不是 SYS.DBMS_UTILITY,该怎么办。您不会知道,他们可以轻松捕获您的电话或做其他有问题的事情。所以有资格。

标签: sql oracle schema


【解决方案1】:

来自 Oracle 文档: http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/sql_elements009.htm

以下示例说明了 Oracle 如何解析对 SQL 语句中对象的引用。考虑以下语句,它将一行数据添加到由名称部门标识的表中:

INSERT INTO departments 
VALUES 
(
 280, 
 'ENTERTAINMENT_CLERK', 
 206, 
 1700);

根据语句的上下文,Oracle 确定部门可以:

  • 您自己的架构中的表
  • 您自己的架构中的视图
  • 表或视图的私有同义词
  • 公共同义词

Oracle 在考虑架构之外的命名空间之前,总是会尝试解析您自己架构中的命名空间内的对象引用。在此示例中,Oracle 尝试按如下方式解析名称部门:

  1. 首先,Oracle 尝试在您自己的包含表、视图和私有同义词的模式中的命名空间中定位对象。如果对象是私有同义词,那么 Oracle 会定位同义词所代表的对象。该对象可能在您自己的模式、另一个模式或另一个数据库中。该对象也可以是另一个同义词,在这种情况下,Oracle 会定位该同义词所代表的对象。

  2. 如果对象在命名空间中,则 Oracle 会尝试对对象执行语句。在此示例中,Oracle 尝试将数据行添加到部门。如果对象不是语句的正确类型,则 Oracle 将返回错误。在此示例中,部门必须是表、视图或解析为表或视图的私有同义词。如果部门是一个序列,那么 Oracle 会返回一个错误。

  3. 如果对象目前不在搜索的任何命名空间中,则 Oracle 搜索包含公共同义词的命名空间。如果对象在该名称空间中,那么 Oracle 会尝试对其执行语句。如果对象不是语句的正确类型,则 Oracle 将返回错误。在此示例中,如果部门是序列的公共同义词,则 Oracle 会返回错误。

它的意思是,Oracle 会在向外扩展搜索之前在本地检查您调用的对象。 很可能在您的某些远程对象上存在公共(或您自己的私有)同义词,允许您直接引用它们,而那些没有同义词的对象则必须完全限定。

【讨论】:

  • 我会说“你当前的模式”而不是“你自己的模式”。例如,如果您以TOM 身份登录,则执行ALTER SESSION SET current_schema = BOB,Oracle 将在 BOB 模式中查找表和视图,而不是在 TOM 模式中。
  • @Justin Cave,我完全同意,这部分文字是甲骨文自己的逐字文档。你会认为他们可能会更好地指定它,不是吗。
【解决方案2】:

这取决于您登录时使用的用户名。或者创建/配置数据库链接时使用的用户名。

请参阅,对于每个架构,都有一个用户。如果您以用户“XYZ”身份登录,则无需限定“XYZ”模式中的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    相关资源
    最近更新 更多