2015-10-09 3 views
2

Будет ли локальная база данных нарушаться, если мы создадим таблицу DUAL?Внутренняя функциональность таблицы DUAL?

Подтвердить?

create table DUAL 
(
     x varchar2(1) 
); 
+1

Зачем вам это нужно? Есть ли причина, по которой вы хотите создать таблицу с именем DUAL? – brenners1302

+0

Связанное обсуждение (не дубликат) о других способах возиться с DUAL: http://stackoverflow.com/questions/29846860/interview-can-we-drop-dual-table?rq=1 – Thilo

+1

@Brenners, несколько дней один из членов моей команды создал таблицу с именем DUAL, из-за чего вся локальная БД была нарушена. – MastanSky

ответ

1

Нет, вы не можете создать двойной стол. Таблица DUAL принадлежит SYS, а SYS владеет словарем данных, поэтому вы не можете его создать.

См wiki

ДВОЙНОЙ таблица представляет собой специальный однорядная таблица присутствует по умолчанию во всех установки базы данных Oracle. Он подходит для использования при выборе псевдокоманды , такой как SYSDATE или USER. В таблице есть один столбец VARCHAR2 (1) , называемый DUMMY, который имеет значение «X».

Даже если вы попытаетесь создать таблицу DUAL, это создаст проблемы для вас, поскольку каждый раз, когда движок Oracle должен гарантировать, что вы не вызываете двойную таблицу SYS. Вам также нужно указать базу данных и схему. Это может привести к слишком большой проблеме двусмысленности для Oracle engine. Оптимизатор Oracle знает все, что делает DUAL, и что он должен делать, и затем он делает все на основе этого.

SQL Reference:

DUAL представляет собой таблицу, автоматически создается Oracle Database вместе с в словаре данных. DUAL находится в схеме пользователя SYS, но есть , доступный по имени DUAL для всех пользователей. Он имеет один столбец, DUMMY, , определенный как VARCHAR2 (1), и содержит одну строку со значением X. Выбор из таблицы DUAL полезен для вычисления постоянного выражения с помощью инструкции SELECT. Поскольку DUAL имеет только одну строку, константа возвращается только один раз. Кроме того, вы можете выбрать константу, псевдоколонку или выражение из любой таблицы, но значение будет возвращено столько раз, сколько строк в таблице. Обратитесь к в «О функциях SQL» для многих примеров выбора значения константы из DUAL.

Начиная с Oracle Database 10g Release 1, логический ввод-вывод не , выполненный в таблице DUAL при вычислении выражения, которое не содержит , содержит столбец DUMMY. Эта оптимизация указана как FAST DUAL в плане выполнения. Если вы выбрали столбец DUMMY из DUAL, то эта оптимизация не выполняется и происходит логический ввод-вывод.

+0

Но вы можете создать новую таблицу под названием DUAL в своей собственной схеме, нет? Я предполагаю, что вопрос в том, что может сломаться, если вы это сделаете. – Thilo

+0

@Thilo: - Обновлен мой ответ! Да, мы можем создать, но это очень не рекомендуется. (Для OP, чтобы понять) –

+0

Главное, чтобы гарантировать одну строку в пользовательской таблице DUAL и вызовы встроенных функций, которые сами зависят от SYS.DUAL. –

1

Будет ли локальная база данных нарушаться, если мы создадим таблицу DUAL?

Да, конечно, странные вещи могут и произойдут. DUAL принадлежит SYS. SYS владеет словарем данных, поэтому DUAL является частью словаря данных. Вы не должны изменять словарь данных через SQL когда-либо.

И первый вопрос: «Как вы гарантируете только одну строку в вашей собственной таблице DUAL?

Это восходит к оригинальной статье Self-Managing PL/SQL по Стивен Фойерштайна, где он объясняет, «Используйте свой собственный DUAL Таблица». Но это было тогда, когда таблица DUAL была подвержена таким вещам.

Однако в последних выпусках структура таблицы DUAL была надежной, и вы не можете иметь более одной строки. Вот доказательство:

SQL> conn [email protected] as sysdba 
Enter password: 
Connected. 
SQL> insert into dual select * from dual; 

1 row created. 

SQL> select * from dual; 

D 
- 
X 

Я знаю, некоторые утверждают, что мы можем обрабатывать один ряд с нашей собственной DUAL таблицы с помощью триггера или ROWNUM = 1, однако, вы скоро поймете минусы. Это просто не нужно из 10g на подопечных, так как таблица DUAL теперь является структурой памяти, и вы не можете добавить к ней строку, как показано выше.

Представьте себе ситуацию, когда вы создали свой собственный DUAL таблицу, и вы используете вызов DUAL таблицы в коде PL/SQL, чтобы получить USER, SYSDATE, SYSTIMESTAMP и т.д.

Это код взят из файла stdbody.sql поставляется с Oracle Database:

1 FUNCTION USER 
2 RETURN VARCHAR2 
3 IS 
4 c VARCHAR2 (255); 
5 BEGIN 
6 SELECT USER 
7 INTO c 
8 FROM SYS.DUAL; 
9 
10 RETURN c; 
11 END; 

Если вы когда-либо иметь более чем одну строку в вашем собственном DUAL таблице, каждый вызов функции USER в коде PL/SQL проваливается с TOO_MANY_ROWS ошибка.

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