В средах IBM Rational ClearQuest, использующих БД Oracle версии 10g и более поздних версий, администратор может при помощи одной из функций ClearQuest версии 7.0.1 разрешить пользователям выполнять запросы к многострочным текстовым полям и получать регистронезависимые результаты. В этой статье также объясняется, как вернуться к регистрозависимости запросов для всего индекса базы данных или только для одного поля.
По умолчанию, запросы в IBM Rational ClearQuest, которые обращаются к многострочным текстовым полям в базе данных Oracle, могут возвращать только регистрозависимые результаты, потому что эта база данных для хранения таких полей использует регистрозависимый тип данных Character Large Object (CLOB). Следовательно, запрос по слову Test не выдаст совпадений со словами test или TEST.
Однако если вы используете СУБД Oracle Database 10g или более поздних версий, то для получения регистронезависимых результатов можно воспользоваться функцией, доступной в ClearQuest и ClearQuest MultiSite версии 7.0.1. Если вы задействуете эту функцию, то запрос по слову Test обнаружит совпадения с test, TEST, и любым другим сочетанием букв верхнего и нижнего регистров, если в остальном написание этих слов не отличается.
Примечание: Эта функция ClearQuest недоступна для баз данных Oracle более ранних версий, чем Database 10g.
Для того чтобы разрешить регистронезависимые запросы, необходимо выполнить следующие шаги:
- Идентифицировать все многострочные текстовые поля в пользовательской базе данных;
- Получить необходимые разрешения от администраторов базы данных и ClearQuest;
- Создать индексы для всех многострочных текстовых полей, которые будут индексироваться;
- Включить функцию, добавив флаг поведения в таблицу, предварительно создав ее, если она не существует;
- Выполнить сценарий SQL, чтобы создать индексы для всех многострочных полей, которые будут использоваться для запросов.
В нашей статье этот процесс описывается более подробно, и, кроме того, объясняется, как вернуться к регистрозависимости запросов по умолчанию.
Необходимые условия
- Для создания индексов для регистронезависимых запросов к многострочным текстовым полям в базах данных Oracle вам понадобятся некоторые инструментальные средства. Итак, у вас должен быть доступ к следующим программам:
- Rational ClearQuest Designer;
- Клиентское ПО Oracle, версия 10 или более поздняя;
- Интерфейс Oracle SQL*Plus, версия 10 или более поздняя.
- Для выполнения утилит создания индексов необходим административный сервер Rational ClearQuest версии 7.0.1, установленный в среде Microsoft Windows. ПО ClearQuest может быть размещено на той же системе, что и клиент Oracle и SQL*Plus, но это не обязательное условие;
- Чтобы разрешить запросы, которые могут возвращать регистронезависимые результаты, необходимо использовать язык с кодовой страницей, содержащей символы ASCII и поддерживаемой Rational ClearQuest. Эти языки и их кодовые страницы перечислены в таблице 1:
Таблица 1. Кодовые страницы и ассоциированные с ними языки
Кодовая страница |
Языки |
20127 (US_ASCII) |
Английский |
Safe Shift-JIS (60932) |
Японский |
932 |
Японский |
936 |
Упрощенный китайский |
949 |
Корейский |
950 |
Традиционный китайский |
1250 (восточноевропейская) |
Чешский, хорватский, венгерский, польский, румынский, словацкий, словенский, албанский |
1251 (кириллическая) |
Белорусский, болгарский, македонский, русский, сербский, украинский |
1252 (западноевропейская) |
Испанский, датский, немецкий, английский, французский, итальянский, норвежский, голландский, португальский, шведский |
1253 |
Греческий |
1254 |
Турецкий |
1255 |
Иврит |
1257 (прибалтийская) |
Эстонский, литовский, латышский |
Дополнительную информацию о кодовых страницах можно найти под заголовком Администрирование Rational ClearQuest в разделе Ресурсы в интернет-документации по ClearQuest.
Как разрешить использование регистронезависимых запросов
Эту задачу обычно выполняет администратор Rational ClearQuest, который имеет четкое представление о схеме и полях, используемых для запросов при поддержке администратора базы данных Oracle, который хорошо знает базы данных Oracle и интерфейс SQL*Plus.
Шаг 1. Идентификация всех многострочных текстовых полей в пользовательской базе данных
Чтобы начать процедуру разрешения регистронезависимых запросов, просмотрите схему пользовательской базы данных и идентифицируйте все многострочные текстовые поля. Некоторые поля, которые выглядят, как короткие строки, могут на самом деле быть многострочными текстовыми полями, как, например, поля Keywords и Symptom в схеме Defect Tracking. Один из способов, позволяющих определить, какие поля являются многострочными текстовыми полями - это использование сеткиFields. Для этого:
- Запустите Rational ClearQuest Designer;
- Откройте схему;
- Разверните иерархию типов записи;
- Нажмите левой кнопкой мыши значок Fields в панели Workspace , чтобы вывести на экран сетку Fields;
- В сетке Fields установите флажок для MULTILINE_STRING в столбце Type и создайте список полей, которые имеют тип MULTILINE_STRING;
Если в ваших базах данных много многострочных текстовых полей, вы можете идентифицировать их при помощи утилиты PDSQL которая устанавливается в Windows вместе с Rational ClearQuest. Для того чтобы идентифицировать все многострочные текстовые поля при помощи утилиты командной строки PDSQL, выполните следующие действия:
- Создайте файл, содержащий одну команду columns
<имятаблицы>
, с символом "точка с запятой" в конце выражения. Например:
C:\testpdsql.scr columns defect;
|
- Перенаправьте этот файл в PDSQL при помощи оператора перенаправления < и передайте на вход команды
grep
для поиска полей CLOB;
- Затем перенаправьте этот файл утилите командной строки PDSQL при помощи оператора перенаправления < и передайте вывод на вход команды
grep
для поиска многострочных текстовых полей CLOB Ниже приводится пример такой команды:
C: ClearQuest>pdsql -v ora -s <host> -db <dbname> -u <cqschema_user>
-p <pw> < c:\testpdsql.\scr / grep CLOB
|
Система сгенерирует список всех полей CLOB, обнаруженных в таблице defect (см. таблицу 2).
Таблица 2. Поля CLOB, обнаруженные в таблице defect
Тип |
Поле CLOB |
ОПИСАНИЕ |
CLOB (2147483647,0) |
KEYWORDS |
CLOB (2147483647,0) |
SYMPTOMS |
CLOB (2147483647,0) |
NOTE_ENTRY |
CLOB (2147483647,0) |
NOTES_LOG |
CLOB (2147483647,0) |
IMPL_COMPLETED_BY |
CLOB (2147483647,0) |
Дополнительную информацию об использовании утилиты PDSQL можно найти в техническом бюллетене IBM № 1145079, Information about PDSQL and how to use it (Информация об утилите PDSQL и ее использовании).
Шаг 2. Получение разрешений от администраторов
Прежде чем вы сможете начать создавать индексы для многострочных текстовых полей, администратор базы данных должен предоставить полномочия на создание индексов администратору Rational ClearQuest, который управляет базой данных. Администратор базы данных предоставляет полномочия с указанием имени пользователя и пароля администратора базы данных Oracle, а также TNSname пользовательской базы данных. После этого администратор базы данных выполняет сценарий setup_cq_ora_user_clob.sql
и указывает идентификатор входа пользователя Oracle, созданный для пользовательской базы данных. Для этого используется следующий синтаксис (эта одна команда, которая может переноситься на следующие строки экрана, если не умещается в одну строку):
> sqlplus <oracle_DBA_user>/<password>@<tnsnamesentry>@setup_cq_ora_user_clob.sql
<oracle_user>
|
Шаг 3. Создание индексов для всех многострочных текстовых полей, которые будут индексироваться.
В Oracle Database 10g многострочные текстовые поля, не имеющие индексов, не могут использоваться в запросах. При создании индекса для разрешения регистронезависимых запросов по любому из многострочных текстовых полей вы должны создать индекс для каждого многострочного текстового поля, которое используется в запросах. Однако не все запросы должны быть регистронезависимыми. Кроме того, не каждому многострочному текстовому полю нужна поддержка регистронезависимых запросов. При создании индексов для каждого из полей вы можете решить, будут ли запросы для этого поля регистрозависимыми или регистронезависимыми. Выполняя сценарий SQL setup_cq_clob_index
, вы можете выбрать, какие поля будут поддерживать регистронезависимые запросы, а какие - регистрозависимые.
Например, можно создать индекс, поддерживающий регистронезависимые запросы, в поле Description , и индекс, поддерживающий регистрозависимые запросы, в поле Keyword . Однако если вы не создадите индекс для поля Keyword, а затем попробуете выполнить к нему запрос, этот запрос не будет выполнен, а система выведет отчет об ошибке.
Используйте сценарий setup_cq_clob_index.sql
, чтобы создать индексы для многострочных текстовых полей. Необходимо создать индекс для всех многострочных текстовых полей в пользовательской базе данных, если текстовый запрос используется в качестве фильтра.
Совет: Индексы для регистрозависимых и регистронезависимых запросов создаются при помощи одного и того же сценария.
Сценарий setup_cq_clob_index.sql
хранится в каталоге Rational ClearQuest, который в вашей системе может иметь указанный ниже или другой путь:
C:\Program Files\Rational\ClearQuest
Для каждого из многострочных текстовых полей запустите сценарий setup_cq_clob_index.sql
и выполните следующие шаги:
- Укажите имя пользователя и пароль для Oracle администратора ClearQuest и имя TNSname пользовательской базы данных:
> sqlplus <oracle_user>/<password>@<tnsnamesentry>@setup_cq_clob_index.sql
|
- Сценарий предложит либо удалить существующий индекс, либо создать новый. Укажите, что требуется создать новый индекс для многострочного текстового поля;
- Введите имя для типа записи Rational ClearQuest ,например,
defect
;
- Введите имя поля Rational ClearQuest ,например,
description
;
- Укажите, что пользовательская база данных имеет версию Oracle 10 или более позднюю;
- Введите BASIC_LEXER. Лексический анализатор - это программный компонент, который делит строку текста на отдельные слова, или лексемы, чтобы можно было проиндексировать отдельные слова. Ниже приводится список поддерживаемых типов лексических анализаторов. (Остальные лексические анализаторы поддерживают индексацию для языков, в которых нет деления на буквы верхнего и нижнего регистра, а пробел не является разделителем между словами);
- Укажите, что индекс должен быть регистронезависимым. Индекс для многострочного поля создан.
Список поддерживаемых лексических анализаторов:
- BASIC_LEXER: лексический анализатор для английского и большинства европейских языков, в которых для разделения слов используются пробелы;
- CHINESE_VGRAM: лексический анализатор для извлечения лексем из текстов на китайском языке;
- CHINESE_LEXER: лексический анализатор для извлечения лексем из текстов на китайском языке. Улучшенная версия CHINESE_VGRAM;
- JAPANESE_VGRAM: лексический анализатор для извлечения лексем из текстов на японском языке;
- JAPANESE_LEXER: лексический анализатор для извлечения лексем из текстов на японском языке. Улучшенная версия JAPANESE_VGRAM;
- KOREAN_LEXER: лексический анализатор для извлечения лексем из текстов на корейском языке;
- KOREAN_MORPH_LEXER: лексический анализатор для извлечения лексем из текстов на корейском языке. Улучшенная версия KOREAN_LEXER.
Информацию об этих лексических анализаторах можно найти в документации по Oracle.
Шаг 4. Включение функции путем добавления флага поведения в таблицу; с предварительным созданием таблицы при необходимости.
Прежде чем вы сможете создать индекс для многострочного текстового поля, вы должны создать в базе данных новую таблицу и добавить флаг поведения, разрешающий индексацию в этой таблице. Выполните следующие шаги при помощи интерфейса Oracle's SQL*Plus:
- Выполните вход в пользовательскую базу данных с идентификатором входа пользователя Oracle, имеющего разрешение на создание таблиц, и укажите TNSname. Имя пользователя и пароль Oracle - это те же имя и пароль, которые вы вводите при создании базы данных при помощи инструмента обслуживания Ratonal ClearQuest. Элемент команды tnsnamesentry это имя базы данных, которое хранится в файле tnsnames.ora;
> sqlplus <oracle_user>/<password>@<tnsnamesentry>
|
- Создайте таблицу с указанными значениями в строках и столбцах;
> sqlplus create table ratl_diagnostics (diag_name VARCHAR2(16), diag_value
VARCHAR2(255));
|
Примечание: Система не сможет создать таблицу, если таблица с указанным именем уже существует в пользовательской базе данных.
- Вставьте в таблицу ratl_diagnostics следующую строку. Эта строка содержит значение, которое позволяет создавать индексы для многострочных текстовых полей;
> sqlplus insert into ratl_diagnostics(diag_name, diag_value)
values ("Behavior", "CLOB_CASE_AND_INDEX");
|
- Зафиксируйте изменение в базе данных.
Примечание: Информацию о параметрах синтаксиса для SQL*Plus можно найти в документации по Oracle.
Дополнительные указания по индексам
- Тестирование производительности: обязательно протестируйте производительность индекса с тестовой базой данных. Как правило, индекс ускоряет выполнение запроса, иногда уменьшая время, необходимое для выполнения запроса по сравнению с временем, которое было бы затрачено без индекса. Однако индексы могут как увеличить, так и уменьшить производительность операций добавления, изменения или удаления записей в базе данных. Чтобы убедиться в том, что индексы не слишком снижают производительность пользовательской базы данных при выполнении этих операций, создайте тестовую базу данных, постройте индекс, а затем измерьте производительность при добавлении, изменении или удалении записей Rational ClearQuest. В том случае, если индексы отрицательно сказываются на общей производительности базы данных, вы можете удалить их из некоторых полей и проинформировать пользователей о том, какие многострочные текстовые поля недоступны для запросов;
- Индексирование для ClearQuest MultiSite: Если вы работаете с Rational ClearQuest MultiSite, то при создании и перемещении баз данных вам придется повторно проиндексировать все многострочные текстовые поля в новых базах данных. Индексы, поддерживающие многострочные текстовые поля, не реплицируются из рабочих основных баз данных в пользовательские базы данных. Следовательно, для каждой пользовательской базы данных необходимо полностью пройти процедуру разрешения регистронезависимых запросов. Чтобы упростить первый шаг этой процедуры (идентификация всех многострочных текстовых полей в пользовательской базе данных), рекомендуем вам вести список всех многострочных текстовых полей, которые необходимо индексировать в рабочей основной базе данных;
- Повторная индексация при перемещении базы данных: При любом перемещении пользовательской базы данных индексы, поддерживающие многострочные текстовые поля, будут утеряны. Следовательно, вы должны повторно проиндексировать все многострочные текстовые поля после перемещения баз данных. Это можно сделать при помощи той же процедуры, которая используется для создания индексов в исходной пользовательской базе данных. Сохраните список всех многострочных текстовых полей в исходной базе данных, чтобы не нужно было создавать их снова при каждом перемещении базы данных. В качестве альтернативы можно написать сценарий для создания всех индексов в перемещенной или обновленной базе данных за один проход. См. пример такого сценария в разделе Загрузка;
- Шумовые слова: При создании индексов необходимо учитывать так называемые "шумовые слова." Это грамматически необходимые слова, которые несут мало полезной информации, например, из, в, это, или ты . Для экономии места ссылки на шумовые слова не обслуживаются индексом, но хранятся в настраиваемом списке шумовых слов для данного языка. Когда вы создадите индексы, они будут автоматически использовать список по умолчанию, чтобы игнорировать эти шумовые слова. Список шумовых слов по умолчанию поставляется для всех основных европейских языков. Вы можете изменить этот список или создать свой. Дополнительную информацию о шумовых словах можно найти в документации по Oracle.
Отключение функции
Разрешив регистронезависимые запросы, можно воспользоваться процедурами для изменения всех или части сделанных настроек несколькими способами:
- Удаление индексов;
- Возврат к регистрозависимости запросов только для одного поля;
- Отключение функции;
- Отзыв полномочий пользователя на создание индексов.
Примечание: Отключение функции необходимо произвести до удаления всех индексов и до отзыва полномочий учетной записи пользователя (если планируется), чтобы избежать ошибок пользователей.
Удаление индексов
После того, как индексы для разрешения регистронезависимых запросов будут созданы, вполне вероятно, что вам понадобится возможность удалить отдельные индексы. Это можно сделать следующим образом:
- Определите идентификатор пользователя и пароль администратора ClearQuest для Oracle и имя TNSname пользовательской базы данных, а затем выполните сценарий
setup_cq_clob_index.sql
:
> sqlplus <oracle_user>/<password>@<tnsnamesentry>@setup_cq_clob_index.sql
|
- Сценарий предложит либо удалить существующий многострочный текстовый индекс, либо создать новый. Укажите, что нужно удалить многострочный текстовый индекс;
- Введите имя типа записи Rational ClearQuest ,например, defect;
- Введите имя поля Rational ClearQuest ,например, description.
Важно: После удаления индекса для многострочного текстового поля это поле больше не может быть использовано для запросов. Следовательно, вам придется информировать об этом пользователей и изменить запросы, использующие это поле.
Возврат к регистрозависимости запросов только для одного поля
После разрешения регистронезависимых запросов для многострочного текстового поля вы можете вернуться к регистрозависимым запросам. Если вы больше не хотите разрешать регистронезависимые запросы для любых полей таблицы, можно отключить индексы для всей таблицы. Можно также вернуться к регистрозависимым запросам только для одного многострочного текстового поля, изменив индекс:
- Воспользуйтесь сценарием
setup_cq_clob_index.sql
для удаления имеющегося индекса;
- Снова запустите сценарий
setup_cq_clob_index.sql
;
- В последнем шаге укажите, что новый индекс должен поддерживать регистрозависимые запросы.
Отключение функции
Если вам больше не нужно использовать регистронезависимые запросы к любым полям таблицы, можно вернуться к настройкам Oracle по умолчанию (регистрозависимые запросы), отключив индексы для всех многострочных текстовых полей в таблице. Чтобы отключить использование всех индексов в таблице, удалите в таблице ratl_diagnostics значение, которое разрешает создание индексов для многострочных текстовых полей:
- После приглашения выполните вход в пользовательскую базу данных с идентификатором и паролем пользователя Oracle и TNSname пользовательской базы данных:
> sqlplus <Oracle_user>/<password>@<tnsnamesentry>
|
Параметр tnsnamesentry
- это имя базы данных, которое хранится в файле tnsnames.ora .
- Введите следующую команду, чтобы удалить из таблицы значение, разрешающее создание индексов для многострочных текстовых полей;
> sqlplus delete from ratl_diagnostics where diag_name
"Behavior" and diag_value = "CLOB_CASE_AND_INDEX"
|
- Зафиксируйте изменение в базе данных.
Отзыв полномочий на создание индексов
Администратор базы данных может отозвать разрешение на создание индексов, ранее предоставленное пользователю Rational ClearQuest. Он должен указать идентификатор и пароль этого пользователя. Чтобы отозвать разрешение на создание индексов, используйте следующие команды SQL:
> sqlplus <Oracle_DBA_user>/<password>@tnsnamesentry>
> sqlplus revoke SELECT ON ctxsys.ctx_indexes from <cq_username>;
> sqlplus revoke ctxapp from <oracle_user>;
|