Чтение онлайн

ЖАНРЫ

Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Борри Хелен

Шрифт:

! ! !

ПРИМЕЧАНИЕ. Метод конфигурирования и возможности защиты системы от злоумышленных атак через доступ к внешним файлам различаются в разных версиях сервера.

. ! .

Формат внешних данных

Firebird сам создаст внешний файл, если не найдет его по месту, указанному в спецификации CREATE EXTERNAL TABLE ' <спецификация--файла>'. ЕСЛИ файл уже существует, ТО каждая его запись должна быть фиксированной длины, состоять из полей фиксированной длины, которая должна в точности соответствовать длине в байтах спецификациям столбцов в определении таблицы. Если приложение, создавшее файл, использует жесткие символы перевода строки (например, двухбайтовую последовательность возврат

каретки и перевод строки в текстовых файлах Windows), включите в описание столбец для приспособления к этой последовательности. См. далее разд. "Символы конца строки".

Данные BLOB и массивы не могут быть считаны или записаны во внешний файл.

Большинство правильно сформированных числовых данных могут читаться непосредственно из внешней таблицы и в большинстве случаев Firebird в состоянии использовать его внутренние правила преобразования для правильной их интерпретации. При этом может оказаться более простым и точным чтение чисел в символьные столбцы и последующее их преобразование с использованием функции CAST.

! ! !

СОВЕТ. Убедитесь, что вы выделили достаточный размер для размещения ваших данных. Для информации о размерах обратитесь к соответствующей главе в части III. Рисунок 8.1 описывает правила преобразования типов данных.

. ! .

CHAR в сравнении с VARCHAR

Использование VARCHAR в определении столбца внешнего строкового поля не рекомендуется, потому что он не является легко переносимым форматом:

<2-байтовое беззнаковое короткое х строка символьных байтов>

VARCHAR требует начального 2-байтового беззнакового числа для включения количества байтов строки, непосредственно за которым следует строка [44] . Для многих внешних приложений может оказаться трудным или невозможным получить доступ к данным. По этой причине используйте CHAR вместо VARCHAR для строковых полей и убедитесь, что приложение переводит эту строку в полный размер.

44

Здесь мы говорим об архитектуре Intel. Выравнивание может отличаться в некоторых архитектурах.

Символы конца строки

Когда вы создаете таблицу, которая будет использована для импорта внешних данных, вы должны определить столбец, содержащий символ конца строки (End-Of-Line, EOL) или новой строки, если приложение, создающее этот файл, включает такой символ. Размер столбца должен быть достаточным, чтобы хранить конкретный системный символ EOL (обычно 1 или 2 байта). Для большинства версий UNIX это 1 байт. Для Windows и Macintosh - 2 байта.

Советы по добавлению непечатаемых символов

При добавлении данных во внешний файл внешняя функция ASCII_CHAR (десятичный- код-ASCII) из библиотеки функций ib udf может быть использована для передачи в

оператор SQL непечатаемых символов в виде выражения для столбцов разделителей строк. Например, следующий оператор добавляет символы возврата каретки и перевода строки в столбец:

INSERT INTO MY_EXT_TABLE (

столбцы . . .,

CRIIF)

VALUES (

Значение-столбца. . .,

ASCII_CHAR(13) и ASCII_CHAR(10));

Альтернативой этому является создание таблицы специально для хранения непечатаемых символов, которые могут понадобиться вашим приложениям. Просто создайте текстовый файл на той же платформе, что и ваш сервер, используя редактор, который "отображает" непечатаемые символы. Откройте вашу "непечатаемую" таблицу, используя интерактивный инструмент, скопируйте и вставьте символы непосредственно в таблицу. Для операторов, выполняющих добавление во внешний файл, символ может быть получен с помощью подзапроса из таблицы [45] .

45

Создание

спецификаций для чтения/записи во внешний файл может потребовать гораздо больше детальных знаний о формате, чем здесь обсуждается. Наборы символов и размеры в байтах могут оказаться проблемой. Во многих случаях использование в качестве набора символов нейтрального набора символов OCTETS в определении внешней таблицы может решить некоторые проблемы. Импорт и экспорт данных не подчиняется принципу "один размер подходит всем".

Операции

Только операции INSERT и SELECT могут быть выполнены над строками внешней таблицы. Попытки изменить или удалить строки вернут ошибки.

Поскольку такие данные располагаются вне базы данных, операции с внешней таблицей не находятся под управлением версиями записей сервера Firebird. Поэтому добавления имеют немедленный эффект и не могут быть отменены (rolled back).

! ! !

СОВЕТ. Если вы хотите, чтобы ваша таблица находилась под управлением транзакции, создайте другую, внутреннюю таблицу Firebird и добавьте данные из внешней таблицы во внутреннюю.

. ! .

Если вы используете DROP DATABASE для удаления базы данных, вы должны также удалить внешний файл - он не будет автоматически удален как результат выполнения DROP DATABASE.

Импорт внешних файлов в таблицы Firebird

Для импорта внешних файлов в таблицы Firebird вначале убедитесь, что у вас установлены соответствующие условия доступа. См. разд. "Конфигурирование внешних размещений"главы 36 относительно параметра сервера ExternairiieAccess.

1. Создайте таблицу Firebird, которая позволит вам просматривать внешние данные. Объявите все столбцы как CHAR. Текстовый файл, содержащий данные, должен находиться на сервере. В следующем примере внешний файл существует в системе UNIX, следовательно, символ EOL занимает 1 байт.

CREATE TABLE EXT_TBL EXTERNAL FILE 'file.txt' (

FNAME CHAR (10) ,

LNAME CHAR(20),

HDATE CHAR(10),

NEWLINE CHAR(1));

COMMIT;

2. Создайте другую таблицу Firebird, которая в итоге будет вашей рабочей таблицей. Включите столбец для символа EOL, если вы позже собираетесь экспортировать данные из внутренней таблицы назад во внешний файл:

CREATE TABLE PERSONNEL (

FIRST_NAME VARCHAR(10),

LAST_NAME VARCHAR(20) ,

HIRE_DATE DATE,

NEW_LINE CHAR(1));

COMMIT;

3. Используя текстовый редактор или приложение, которое может выводить текст фиксированного формата, создайте и заполните внешний файл. Сделайте все записи одинаковой длины, заполняя неиспользуемые символы пробелами, и добавьте символ(n) EOL в конец каждой записи.

Количество символов в строке EOL зависит от платформы - см. предыдущие замечания.

Следующий пример иллюстрирует запись фиксированной длины в 41 символ, b представляет пробел, a n - EOL:

12345678901234567890123456789012345678901

fname. . . . . lname. . . . . . . hdate n

JamesbbbbbStarkeybbbbbbbbbbbbb2004-12-10n

ClaudiobbbValderramabbbbbbbbbb2003-10-01n

4. Оператор SELECT для таблицы EXT_TLB возвращает записи из внешнего файла:

SELECT FNAME, LNAME, HDATE FROM EXT_TBL;

FNAME

LNAME

HDATE

=====

=====

=====

James

Starkey

2004-12-10

Claudio

Valderrama

2003-10-01

Поделиться с друзьями: