Форум программистов, компьютерный форум, киберфорум
turbanoff
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Оценить эту запись

Лимит Oracle Database на генерируемые имена

Запись от turbanoff размещена 24.01.2013 в 10:18
Обновил(-а) turbanoff 16.11.2015 в 15:28

Сегодня задался вопросом, как Oracle выбирает имена для автогенерируемых объектов.
Конкретно интересовал вопрос выбора имени для таблицы со временными mview логами.

mview логи на таблице позволяют создавать быстро обновляемые (fast refresh) материализованные представления, испольующие исходную таблицу.

Вкратце:
Если на таблице создать materialized view log:
SQL
1
2
CREATE TABLE T1(a CHAR PRIMARY KEY);
CREATE materialized VIEW log ON T1 WITH PRIMARY KEY;
В этом случае oracle создаст 3 таблицы:
Собственно таблицу T1 и две таблицы с логами.
TABLE_NAME
MLOG$_T1
T1
RUPD$_T1

Как видно oracle добавляет к имени таблицы MLOG$_/RUPD$_ - и получает имя таблицы с логами.

Сразу возник вопрос, что будет с таблицами, чьи имена длиннее 24. (Так как лимит на имя объекта в oracle - 30 символов, минус 6 символов на приставку MLOG$_/RUPD$_ получаем 24).

Пробуем
SQL
1
2
CREATE TABLE T2_tt_0123456789_pp_0123456789(a CHAR PRIMARY KEY);
CREATE materialized VIEW log ON T2_tt_0123456789_pp_0123456789 WITH PRIMARY KEY;
Результат
TABLE_NAME
T2_tt_0123456789_pp_0123456789
MLOG$_T2_tt_0123456789_pp_
RUPD$_T2_tt_0123456789_pp_

Ага, значит обрезает имя. Смотрим что будет если создать еще одну таблицу с таким же началом
SQL
1
2
CREATE TABLE T2_tt_0123456789_pp_0123456788(a CHAR PRIMARY KEY);
CREATE materialized VIEW log ON T2_tt_0123456789_pp_0123456788 WITH PRIMARY KEY;
Результат
TABLE_NAME
T2_tt_0123456789_pp_0123456788
MLOG$_T2_tt_0123456789_pp_1
RUPD$_T2_tt_0123456789_pp_1

Длина имени таблицы с логами получается 26-27 символов. Значит чтобы дойти до лимита в цифрах, необходимо 10000 уже занятых имен.
Сразу захотелось узнать что же будет дальше

Сказано - сделано. Создает скрипт, создающий 10000 таблиц с именами RUPD$_T2_tt_0123456789_pp_1, RUPD$_T2_tt_0123456789_pp_2, RUPD$_T2_tt_0123456789_pp_3 и т.д.
SQL
1
2
SELECT 'create table RUPD$_T2_TT_0123456789_PP_' || rownum || '(a char primary key);' FROM dual
CONNECT BY rownum < 10000
результат копируем -> выполняем. курим.

через несколько минут у нас все имена заняты. Смотрим как Oracle поведет, если создать еще одну таблицу с логами:
SQL
1
2
CREATE TABLE T2_tt_0123456789_pp_0123456787(a CHAR PRIMARY KEY);
CREATE materialized VIEW log ON T2_tt_0123456789_pp_0123456787 WITH PRIMARY KEY;
И тут Oracle вываливает ошибку:
Цитата:
ORA-01948: identifier's name length (31) exceeds maximum (30)
Алгоритм генерации имен не ожидал, что мы можем создать СТОЛЬКО таблиц/mlog-ов

PS. Используемая версия:
Цитата:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for 64-bit Windows: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
Размещено в Без категории
Показов 6341 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru