25 августа 2026

Как научить PowerDesigner добавлять полям индекса порядок сортировки

В компании, где я работал будучи студентом, для проектирования модели базы данных использовали ERwin. Мне он сразу показался, мягко сказать, не очень удобным. Для нового проекта я взял у своего знакомого PowerDesigner 6.0 (пришлось записать целых 5 дискет по 1.44 МБ!). С тех пор PowerDesigner используется мной в каждом проекте, где я сам выбираю инструментарий. Вы скажете, что это "как стрелять из пушки по воробьям". Да, я с этим согласен. Но десятки лет его использования вызвали стойкое привыкание. Хотя к PowerDesigner у меня тоже есть вопросы. Хорошо, что большинство из них решаемы. Для примера рассмотрим, как научить PowerDesigner добавлять в генерируемый DDL-скрипт полям индекса порядок сортировки. Да, у этого мощнейшего программного обеспечения есть такая маленькая проблемка.

Сначала немного теории. Для генерации DDL-скриптов, реверс-инжиниринга баз данных и генерации объектного кода приложений PowerDesigner использует правила записанные в файлы определений СУБД (DBMS Definition Files) с расширением xdb и файлы определений объектных языков (Object Language Files) с расширением ool. Это файлы формата XML. В их тегах хранятся различные параметры и шаблоны написанные на специализированном макроязыке, который официально называется PowerDesigner Generation Language (GTL). GTL – это мощный объектно-ориентированный макроязык шаблонов, который позволяет PowerDesigner превращать абстрактные элементы модели базы данных в реальный DDL-скрипт, отчеты, XML-схемы и классы для Java, C#, C++, PowerBuilder и Visual Basic .NET. Создавая новые xdb и ool файлы можно научить PowerDesigner работать с любыми СУБД и языками программирования. А корректировка существующих файлов позволяет его гибко настраивать. Сейчас мне часто приходится проектировать базы данных под PostgreSQL. К моему сожалению, его поддержку в PowerDesigner почти не развивали. Мой PowerDesigner 16.7.5, вышедший в один год с PostgreSQL 14, содержит файлы определений только для PostgreSQL 8 и 9, и те с сильно урезанными возможностями (там даже нет больше чем одной третьей типов данных). Поэтому я сам понемногу "допиливаю" pgsql9.xdb под наши нужды.

Теперь практика. Нарисуем в PowerDesigner тестовую табличку, добавим ей индексы и попробуем указать их полям порядок сортировки. В свойствах индекса мы видим, что в таблице со списком его полей ячейка столбца "Sort" заблокирована, то есть мы не можем изменить у поля порядок сортировки:

Список полей индекса в PowerDesigner без возможности изменить порядок сортировки
Разблокировать ячейки столбца "Sort" можно в xdb-файле выбранной СУБД. Для наглядности сделаем это через встроенный в PowerDesigner редактор DBMS Definition Files, хотя можно и просто изменить xdb-файл в любом текстовом редакторе. Что бы открыть встроенный редактор, в главном меню выберем "Tools -> Resources -> DBMS -> PostgreSQL 9 -> Properties" (вместо PostgreSQL может быть любая другая СУБД) или "Database -> Edit Current DBMS" (пункт меню доступен, если открыта схема физической модели данных). В дереве свойств перейдем по пути: "Script -> Objects -> Index", выберем параметр EnableAscDesc, переключим его значение на "Yes" и нажмем OK.
Параметр PowerDesigner генерации индексов EnableAscDesc
В свойствах нашего индекса откроем список его полей. Теперь ячейка разблокирована и можно поменять порядок сортировки с Ascending на Descending:
Список полей индекса в PowerDesigner с возможностью изменить порядок сортировки с Ascending на Descending
Посмотрим, что у нас получилось в предварительном просмотре DDL-скрипта таблицы:
Предварительный просмотр DDL-скрипта создания таблицы с некорректным индексом в PowerDesigner
Интерфейс разблокировался, но слово DESC в генерируемом DDL-скрипте не появилось.

Снова откроем редактор DBMS Definition Files и по пути "Script -> Objects -> Index" выберем параметр AddColIndex:

Параметр PowerDesigner генерации индексов AddColIndex
Переменная %COLUMN%, которую вы видите, – это имя столбца таблицы добавляемого в индекс. При таком описании PowerDesigner в DDL-скрипт записывает только имя столбца, выбранный для него порядок сортировки игнорирует. Для того чтобы в скрипте появился порядок сортировки нам понадобится переменная %ASC%, которая, в зависимости от заданного для поля порядка сортировки, содержит слово "ASC" или "DESC". Заменяем значение параметра AddColIndex с %COLUMN% на "%COLUMN% %ASC%" и смотрим результат:
Предварительный просмотр DDL-скрипта создания таблицы с индексами ASC и DESC в PowerDesigner
Теперь индекс по полю created_at имеет порядок сортировки по убыванию, а индекс по полю name по возрастанию. Мы добились нужного результата. Но он мне не нравится. ASC – это значение порядка сортировки по умолчанию, поэтому его обычно не указывают. Как избавиться от ASC? Что бы PowerDesigner игнорировал значение пустой переменной ее можно взять в квадратные скобки (например, "%COLUMN%[ %ASC%]"). Но, к сожаленью, нам это не поможет, т.к. переменная %ASC% всегда содержит значение. Спасением является то, что GTL поддерживают тернарные операторы. Сравнивать значение переменной %ASC% с ASC или DESC можно, но мы не будем. Воспользуемся специальной логической переменной %ISASC%, которая содержит TRUE, если сортировка по столбцу индекса должна выполняться по возрастанию (ascending/ASC). Заменим значение параметра AddColIndex на "%COLUMN%[%ISASC%? : DESC]".
Предварительный просмотр DDL-скрипта создания таблицы с правильными индексами в PowerDesigner
Теперь все идеально!

P.S. Что бы редактор DBMS Definition Files мог сохранить на диск измененный xdb-файл PowerDesigner надо запускать от имени администратора.

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

Отправить комментарий