Двойной стол - PullRequest
       5

Двойной стол

0 голосов
/ 05 июля 2018

Привет Мы все знаем, DUAL - это таблица SYS, и другие пользователи имеют ее синоним. но когда я запускаю нижеследующий комнад

 create table dual(x varchar2(1));

это сработало. Был создан объект с именем DUAL.

когда уже есть синоним с именем DUAL как мы можем создать другой объект с таким же именем? почему оракул позволяет нам делать это.

Ответы [ 4 ]

0 голосов
/ 05 июля 2018

Мне кажется, я нашел способ продемонстрировать, что происходит (без использования DUAL или любого другого SYS объекта; -):

Если два пользователя создают таблицу с одинаковыми именами, таблицы оказываются в своей собственной схеме, как и ожидалось:

CREATE USER user_a IDENTIFIED BY user_a;
CREATE USER user_b IDENTIFIED BY user_b;

CREATE TABLE user_a.foo (x NUMBER);
CREATE TABLE user_b.foo (x NUMBER);

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

OBJECT_ID OBJECT_TYPE OWNER   OBJECT_NAME NAMESPACE
    78225 TABLE       USER_A  FOO                 1
    78226 TABLE       USER_B  FOO                 1

Но когда один из них создает общедоступный синоним (как SYS сделал со своей таблицей DUAL), он заканчивается магической схемой с именем PUBLIC:

CREATE PUBLIC SYNONYM foo FOR user_a.foo;

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

OBJECT_ID OBJECT_TYPE OWNER   OBJECT_NAME NAMESPACE
    78225 TABLE       USER_A  FOO                 1
    78226 TABLE       USER_B  FOO                 1
    78156 SYNONYM     PUBLIC  FOO                 1

Итак, другими словами, общедоступные синонимы - это просто синонимы, которые живут в схеме PUBLIC. И вы можете иметь только одну таблицу, представление, последовательность, пакет, синоним с тем же именем на схему.

0 голосов
/ 05 июля 2018

Вы можете создать таблицу с именем DUAL, поскольку таблицы и публичные синонимы имеют другое пространство имен. Подробнее см. Главу Имена и квалификаторы объектов базы данных Справочника по языку SQL Oracle.

РЕДАКТИРОВАТЬ: Для иллюстрации механизма:

Если вы создаете свою собственную таблицу DUAL как пользователь scott

CREATE TABLE dual (x VARCHAR2(1));

... тогда это появляется в словаре данных:

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

Итак, имена уникальны для каждого владельца и пространства имен. Вы не можете добавить еще одну таблицу в вашу схему с именем DUAL. Вы не можете создать частный синоним с именем DUAL, но вы можете создать свой собственный синоним для схем в других объектах.

Пожалуйста, не забудьте снова уронить стол. Даже простые утверждения больше не будут работать:

SELECT sysdate FROM DUAL;
--


DROP TABLE dual;
SELECT sysdate FROM DUAL;
01.07.2018
0 голосов
/ 05 июля 2018

Я думаю DUAL - это отвлечение. Конечно, это системная таблица и есть побочные эффекты, если вы возитесь с ней, так что не надо. Но на самом деле вопрос заключается в том, почему не возникает конфликт пространства имен между любым объектом и публичным синонимом с тем же именем. Например, я могу создать таблицу с именем ALL_TABLES или DBMS_OUTPUT в своей собственной схеме (если я действительно этого хочу). Или я могу создать таблицу с именем MYDEMOTABLE, а затем создать общедоступный синоним MYDEMOTABLE для WILLIAM.MYDEMOTABLE.

Но тогда, какое ограничение вы ожидаете существовать? Уже существует таблица (принадлежит SYS) и общедоступный синоним (принадлежит PUBLIC) с именем DUAL. Вы можете создать третий объект с тем же именем, если он не принадлежит SYS или PUBLIC.

0 голосов
/ 05 июля 2018

В вашей единой базе данных есть различные схемы. Когда вы спросили о таблице DUAL по умолчанию, которая на самом деле принадлежит 'sys' Schema, которая является системной схемой. Но ваша схема базы данных по умолчанию - dbo, это означает, что когда вы выполнили запрос для создания таблицы DUAL, она фактически создается в схеме по умолчанию с именем dbo.


Если вы хотите проверить их фактическое двойное существование, есть много способов проверить.

  • Вы можете применить запрос как "select * from sys.DUAL" и "select * from dbo.DUAL". там вы увидите два разных выхода.
  • Вы можете проверить все схемы в "select * from sys.schemas".
  • Кроме того, вы можете проверить их различные схемы с именем таблицы

    "select * from sys.tables where name ='DUAL'"; В результате получатся две разные таблицы с двумя разными идентификаторами схемы.

Надеюсь, это поможет вам понять основы схемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...