Мне кажется, я нашел способ продемонстрировать, что происходит (без использования 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
. И вы можете иметь только одну таблицу, представление, последовательность, пакет, синоним с тем же именем на схему.