双表问题

Onk*_*ari 2 sql database oracle

嗨我们都知道DUALSYS和其他用户的表有它的同义词.但是当我解雇下面的公共场所时

 create table dual(x varchar2(1));
Run Code Online (Sandbox Code Playgroud)

有效.DUAL创建了该名称的对象.

当已经有名称的同义词时,DUAL我们如何创建另一个同名的对象?为什么oracle允许我们这样做.

wol*_*lφi 7

您可以创建一个名为DUALtable的表,因为表和公共同义词具有不同的命名空间.有关详细信息,请参阅Oracle SQL语言参考的数据库对象名称和限定符一章.

编辑:说明机制:

如果您DUAL以scott用户身份创建自己的表

CREATE TABLE dual (x VARCHAR2(1));
Run Code Online (Sandbox Code Playgroud)

...然后它出现在数据字典中:

SELECT object_id, object_type, owner, object_name, namespace 
  FROM dba_objects 
 WHERE object_name='DUAL';

OBJECT_ID OBJECT_TYPE OWNER  OBJECT_NAME NAMESPACE
      142 TABLE       SYS    DUAL                1
      143 SYNONYM     PUBLIC DUAL                1
    78138 TABLE       SCOTT  DUAL                1
Run Code Online (Sandbox Code Playgroud)

因此,每个所有者名称空间的名称都是唯一的.您无法在架构中添加另一个名为DUAL的表.您无法创建名为DUAL的私有同义词,但您可以为其他对象中的模式创建自己的同义词.

请务必再次放下桌子.即使是简单的陈述也不再适用:

SELECT sysdate FROM DUAL;
--


DROP TABLE dual;
SELECT sysdate FROM DUAL;
01.07.2018
Run Code Online (Sandbox Code Playgroud)