Общее описание проблемы

В приложении Галактика EAM (также и в некоторых других приложениях на платформе Xafari) имена объектов базы данных (таблиц, полей, индексов) задаются на русском языке. Эта особенность может приводить к проблемам с запуском приложения на СУБД Oracle.

Проблема 1

Особенностью СУБД Oracle является то что длина имен идентификаторов в ней может быть не более 30 байт. Если при генерации структуры БД встретится идентификатор длинной более 30 байт, то возникнет ошибка ORA-00972: слишком длинный идентификатор и объект БД не будет создан.

Приложения на платформе Xafari используют для генерации структуры БД приложения механизмы DevExpress (XPO). При генерации БД Oracle платформа DevExpress проверяет длину идентификаторов перед генерацией БД и если длина превышает 30 символов, то обрезает имя идентификатора до 30 символов по определенным правилам чтобы обеспечить успешную генерацию БД.

В работе механизма генерации структуры БД DevExpress скрыта ошибка, этот механизм учитывает количество символов в имени идентификатора, а не количество байт. Но в СУБД Oracle есть настройки БД, которые влияют на то какое количество байт отводится на один символ (1, 2 а может и более).

В результате, если экземпляр БД сконфигурирован так что русская буква занимает 2 байта, то допустимая длина имени идентификатора уже становится не 30 (русских) символов, а 15 (русских) символов. И, например, такой запрос

create table "ReportGroup" ("Oid" char(36) NOT NULL, "ДатаСоздания" date NULL, "Создатель" nvarchar2(100) NULL, "СозданПользователем" nvarchar2(100) NULL, "ДатаПоследнейМодификации" date NULL, "Редактор" nvarchar2(100) NULL, "ИзмененПользователем" nvarchar2(100) NULL, "OwnerBranch" char(36) NULL, "ExternalID" nvarchar2(1000) NULL, "СтроковоеПредставление" nvarchar2(255) NULL, "Код" nvarchar2(80) NULL, "Наименование" nvarchar2(150) NULL, "ImageName" nvarchar2(100) NULL, "СтатусОбъекта" int NULL, "ДатаИзмененияСтатуса" date NULL, "ИзмененияПользователя" nvarchar2(100) NULL, "OptimisticLockField" int NULL, "GCRecord" int NULL)

выдает ошибку ORA-00972: слишком длинный идентификатор. Причем повторюсь, то появится ошибка или нет зависит от параметров настройки экземпляра БД.

Проблема 2

Второй проблемой, связанной с использованием русских букв в качестве наименований объектов БД, может быть проблемы преобразования символов из одной кодировки в другую при передаче текста запроса с клиента на сервер.

Проблема может возникать, например, такая:

  1. Галактика EAM поддерживает Unicode кодировку символов.
  2. Запрос от Галактика EAM передается в клиент Oracle.
  3. Клиент Oracle не поддерживает кодировку Unicode, значит символы запроса будут преобразовываться в кодировку, в которой работает клиент Oracle. При переводе русских букв в другую кодировку, может произойти искажение и все русские буквы будут замены на какой-то служебный символ.

Эта проблема, например, может проявляться при генерации структуры БД для приложения.

Вот такой запрос

create table "ReportGroup" ("Oid" char(36) NOT NULL, "ДатаСоздания" date NULL, "Создатель" nvarchar2(100) NULL, "СозданПользователем" nvarchar2(100) NULL, "ДатаПоследнейМодификации" date NULL, "Редактор" nvarchar2(100) NULL, "ИзмененПользователем" nvarchar2(100) NULL, "ExternalID" nvarchar2(1000) NULL, "СтроковоеПредставление" nvarchar2(255) NULL, "Код" nvarchar2(80) NULL, "Наименование" nvarchar2(150) NULL, "ImageName" nvarchar2(100) NULL, "СтатусОбъекта" int NULL, "ДатаИзмененияСтатуса" date NULL, "ИзмененияПользователя" nvarchar2(100) NULL, "OptimisticLockField" int NULL, "GCRecord" int NULL)

может выдавать ошибку ORA-00957: duplicate column name.

Это означает что в результате некорректного преобразования русских букв из одной кодировки в другую они были заменены на один и тот же служебный символ. И в результате на сервер БД пришел запрос в котором создаются колонки с одинаковым именем.

Описание решения

Для того чтобы приложение Галактика EAM нормально генерировало структуру таблиц БД, необходимо чтобы настройки программного обеспечения соответствовали определенным требованиям.

Описание решения Проблемы 1

Общая схема решения задачи

Для того чтобы структура БД генерировалась успешно, необходимо использовать экземпляр БД Oracle с такими настройками чтобы русские буквы занимали 1 байт.

На это влияет параметр NLS_CHARACTERSET.

Если установлена кодовая таблица в которой русские буквы представляются 2 байтовым кодом, то будет возникать ошибка, например, UNICODE таблицы UTF8, UTF16 и т.п.

Рекомендуется использовать кодовую таблицу CL8MSWIN1251.

Настройка экземпляра БД Oracle

Необходимо создавать экземпляр БД Oracle так, чтобы параметр NLS_CHARACTERSET = CL8MSWIN1251.

Это можно задать ТОЛЬКО при создании нового экземпляра БД.

На созданном экземпляра БД. Этот параметр изменить нельзя.

Например, при создании экземпляра БД с использованием Database Configuration Assistant, требуемые настройки производятся на шаге:

Описание решения Проблемы 2

На клиентском компьютере (компьютер на котором запускается система Галактика EAM) должны быть установлены:

  1. Русифицированная операционная система Windows (установлена поддержка русского языка).
  2. Клиент Oracle должен быть установлен с поддержкой русского языка.

Настройки ОС Windows

В операционной системе Windows должны быть следующие настройки:

  1. Установлен пакет русского языка.
  2. В настройках ОС Windows, в региональных настройках параметр Текущий язык программ, не поддерживающих Unicode должен быть установлен Русский.

Настройки клиента Oracle

В клиенте Oracle должна быть включена поддержка русского языка.

Такая настройка делается в момент установки Oracle Client, на шаге 2.

Резюме

Таким образом, для запуска системы Галактика EAM с СУБД Oracle должны ПО должно удовлетворять требованиям:

  • В экземпляре БД Oracle параметр NLS_CHARACTERSET = CL8MSWIN1251.
  • В ОС Windows клиентского компьютера установлен пакет русского языка.
  • В настройках ОС Windows, в региональных настройках параметр Текущий язык программ, не поддерживающих Unicode должен быть установлен Русский.
  • В клиенте Oracle должна быть включена поддержка русского языка.

P.S.

Описанные выше требования надо включить в требования к программным продуктам для продуктов на платформе Xafari в которых используются русские наименования объектов БД.