Обновление метаданных при переходе на Firebird 2.1

перевод
misc\upgrade\metadata\metadata_charset.txt
выполнен kdv, iBase.ru, 21.04.2008.
Копирование текста запрещается.

Версии Firebird до версии 2.1 имели две проблемы с наборами символов и извлечением метаданных:

  1. При создании и изменении объектов, текст метаданных никогда не транслитерировался (текст процедур/триггеров, описания (rdb$description), констрэйнтов, умолчательных значений, и т.д.) из клиентского набора символов в системный (UNICODE_FSS). То есть, исходный текст просто помещался в столбец с кодировкой UNICODE_FSS.
  2. При чтении текстовых блобов, они не перекодировались из набора символов блоба в клиентский набор символов

пример: при появлении кодировки KOI8R стало возможным, к примеру, хранить данные в 1251, и автоматически конвертировать их при чтении и записи на клиенте в KOI8R, например из клиента под Linux. Это нормально работало со строковыми столбцами, кроме текстов процедур и триггеров и блобов. Блобы, хранимые в Win1251 передавались клиенту без перекодировки в koi8r, и т.д.

Даже в версии 2.1, проблема 1 может возникнуть если вы создаете или изменяете объекты с клиентской кодировкой NONE или UNICODE_FSS, но с текстом не в кодировке UNICODE_FSS.

Если вы создаете или создавали метаданные с не ASCII символами (любые национальные символы, например 1251 и т.д.), то вам нужно "отремонтировать" вашу базу данных чтобы метаданные корректно читались после обновления на 2.1.

Чтобы проделать эту операцию, база данных должна быть в формате ODS11.1 (backup, и затем restore в FB 2.1). Перед этим сделайте копию базы данных.

Также рекомендуется делать реконнект перед выполнением каждого действия, приведенного ниже.

Создайте процедуры перекодировки метаданных в базе данных
---------------------------------------
- 1. isql database.fdb
- 2. SQL> input 'misc/upgrade/metadata/metadata_charset_create.sql';

Проверьте базу данных
----------------------
- 1. isql database.fdb
- 2. SQL> select * from rdb$check_metadata;

Процедура rdb$check_metadata вернет список объектов, которые будут обработаны.

Если ошибок не происходит, то ваши метаданные в порядке, и можно переходить к разделу "Удаление процедур обновления метаданных".

Иначе, первый "плохой" объект является последним в списке перед возникновением ошибки.

Для исправления метаданных, вам нужно знать, в каком наборе символов были созданы эти метаданные. Скрипт обновления метаданных будет работать корректно только если все метаданные были созданы в одном и том же наборе символов.

Исправление метаданных
-------------------
- 1. isql database.fdb
- 2. SQL> input 'misc/upgrade/metadata/metadata_charset_create.sql';
- 3. SQL> select * from rdb$fix_metadata('WIN1252'); -- replace WIN1252 by your charset
- 4. SQL> commit;

Процедура rdb$fix_metadata возвращает те же данные, что и rdb$check_metadata, но с исправлением текста метаданных.
Запускать эту процедуру можно только один раз!

После этого можно удалить процедуры обновления метаданных.

Удаление процедур обновления метаданных
-------------------------------
- 1. isql database.fdb
- 2. SQL> input 'misc/upgrade/metadata/metadata_charset_drop.sql';

Подпишитесь на новости Firebird в России

Подписаться