принудительное использование длины имени функции в Oracle 12 для соответствия стандарту SQL-92

#oracle #plsql #oracle12c #name-length

#Oracle #plsql #oracle12c #длина имени

Вопрос:

в Oracle 12 есть ли способ принудительно установить максимальную длину имени функции (и имен констант) равной только 30 символам? (как в oracle 11g и priors)

Комментарии:

1. На самом деле стандарт SQL-92 определяет верхний предел в 128 символов для идентификаторов.

2. @a_horse_with_no_name спасибо, вопрос обновлен, нам нужно заставить максимальную длину составлять 30 символов, как в oracle 11g

Ответ №1:

Длина имени функции Oracle может быть ограничена с помощью параметра COMPATIBLE или с помощью триггера события.

Установка для параметра COMPATIBLE значения ниже 12.2.0.0.0 предотвратит любые идентификаторы размером более 30 байт. Однако это мощный параметр, который влияет на многие функциональные возможности и не может быть легко изменен.

Более простым, но не таким всеобъемлющим подходом было бы создать триггер события, который блокирует любой DDL, создающий объект с длинным именем объекта. Например, приведенный ниже триггер запрещает одной схеме создавать какие-либо функции с длинными именами.

 create or replace trigger enforce_name_length
--Change "schema" to "database" to protect entire database.
--But be careful and test thoroughly before you block DDL on an entire database.
before create on schema
begin
    if ora_dict_obj_type = 'FUNCTION' and lengthb(ora_dict_obj_name) >= 31 then
        raise_application_error(-20000, 'Cannot create ' || ora_dict_obj_owner || '."' 
            || ora_dict_obj_name || '", the object name is longer than 30 bytes.');
    end if;
end;
/
  

Попытка создать функцию, подобную этой:

 create or replace function large_function_name012345789012 return number is begin return 1; end;
/
  

Сгенерирует эту ошибку:

 ORA-04088: error during execution of trigger 'JHELLER.ENFORCE_NAME_LENGTH'
ORA-00604: error occurred at recursive SQL level 1
ORA-20000: Cannot create JHELLER."LARGE_FUNCTION_NAME012345789012", the object name is longer than 30 bytes.
ORA-06512: at line 3
  

Насколько сильно вам нужно ограничить имена внутри функции? Я могу придумать несколько сложный способ ограничить все идентификаторы функции 30 байтами, но было бы еще сложнее ограничить только постоянные идентификаторы 30 байтами.