Text
                    Хелен Борри
(bhv
Л .. £Ш* II
РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
• Проектирование и разработка клиент/серверных
приложений, использующих СУБД
Firebird/lnterbase
• Установка, конфигурация и администрирование
СУБД
• Программирование на стороне сервера и клиента
• Практические советы, рекомендации и примеры


The Firebird Book: A Reference for Database Developers HELEN BORRIE Apresse
Хелен Борри Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ Санкт-Петербург «БХВ-Петербург» 2006
УДК 681.3.06 ББК 32.973.26-018.2 Б82 Борри X. Б82 Firebird: руководство разработчика баз данных: Пер. с англ. — СПб.: БХВ-Петербург, 2006. — 1104 с.: ил. ISBN 5-94157-609-9 Рассмотрены вопросы, необходимые разработчику для создания клиент- серверных приложений с использованием СУБД Firebird, явившейся развитием СУБД Borland Interbase 6. Содержится обзор концепций и моделей архитектуры клиент/сервер, а также практические рекомендации по работе с клиентскими библиотеками Firebird. Детально описаны особенности типов данных SQL, язык манипулирования данными (Data Manipulation Language, DML), а также синтак- сис и операторы языка определения данных (Data Definition Language, DDL). Большое внимание уделено описанию транзакций и приведены советы по их использованию при разработке приложений. Описано программирование на стороне клиента и сервера: написание триггеров и хранимых процедур, создание и использование событий базы данных, обработка ошибок в коде на сервере и многое другое. Материал сопровождается многочисленными примерами, сове- тами и практическими рекомендациями. Для разработчиков баз данных УДК 681.3.06 ББК 32.973.26-018.2 Группа подготовки издания: Главный редактор Зам. главного редактора Зав. редакцией Перевод с английского Редактор Екатерина Кондукова Игорь Шигиигин Григорий Добин Александра Бондаря Екатерина Капалыгина Компьютерная верстка Корректор Дизайн обложки Зав. производством Ольги Сергиенко Зинаида Дмитриева Игоря Цырульникова Николай Тверских Authorized translation from the original English language edition published by Apress L.P., 2560 Ninth Street, Suite 219, Berke- ley, CA 94710 USA. Copyright © 2002 by Apress L.P. Russian-language edition copyright © 2006 by BHV St. Petersburg. All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher. Авторизованный перевод английской редакции, выпущенной Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 94710 USA. Copyright © 2002 by Apress L.P. Все права защищены. Никакая часть настоящей книги не может быть воспроизве- дена или передана в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механи- ческие, включая фотокопирование и запись на магнитный носитель, а также через другие носители и информационные системы, если на то нет письменного разрешения собственника прав и издательства. Перевод на русский язык "БХВ-Пе- тербург", © 2006. Лицензия ИД № 02429 от £4.07.00. Подписано в печать 01.11.05. Формат 70х1001/16. Печать офсетная. Усл. печ. л. 89,01. Тираж 3000 экз. Заказ № 420 "БХВ-Петербург", 194354, Санкт-Петербург, ул. Есенина, 5Б. Санитарно-эпидемиологическое заключение на продукцию № 77.99.02.953.Д.006421.11.04 от 11.11.2004 г. выдано Федеральной службой по надзору в сфере защиты прав потребителей и благополучия человека. Отпечатано с готовых диапозитивов в ОАО "Техническая книга" 190005, Санкт-Петербург, Измайловский пр., 29 ISBN 1-59059-279-4 (англ.) ISBN 5-94157-609-9 (рус.) © 2002 by Apress L.P. © 2004 by Helen Bonne and IBPhoenix © Перевод на русский язык "БХВ-Петербург”. 2006
Оглавление Введение..............................................................31 Об авторе.............................................................31 О техническом редакторе...............................................31 О научном редакторе перевода на русский язык..........................31 Благодарности.........................................................32 Введение в Firebird...................................................33 Что такое Firebird?...............................................33 Кому нужна эта книга?.............................................33 Где найти нужную вам информацию?..................................33 Приложения и глоссарий............................................34 Происхождение Firebird............................................35 Проект Firebird...................................................36 Снарки............................................................37 Обзор возможностей................................................37 Версии Firebird...................................................37 Доступ к сети.....................................................38 Многоверсионная архитектура.......................................38 Транзакции........................................................38 Хранимые процедуры и триггеры.....................................39 Ссылочная целостность.............................................39 Оперативное копирование базы данных...............................39 Безопасность......................................................40 Пример базы данных................................................42 Соглашения по документации........................................42 Синтаксические шаблоны............................................42 Специальные символы...............................................43 ЧАСТЬ I. УЧЕБНЫЙ ЛАГЕРЬ...............................................45 Глава 1. Инсталляция..................................................47 Системные требования..................................................47 Память на сервере (все платформы).................................47 Инсталляционные диски.............................................48 Минимальные требования к машине...................................49
6 Оглавление Как получить инсталляционный комплект..................................50 Содержание комплекта...............................................50 Соглашения по именованию в комплекте инсталляции...................51 Зеркальные сайты................................................. 52 Комплект поставки для Linux............................................52 Сжатые файлы (tarballs)............................................54 Реализация NPTL для высших версий Linux............................54 Комплект поставки для Windows..........................................55 Сжатые файлы.......................................................56 Серверы............................................................56 Клиентские библиотеки..............................................56 Тестирование результатов инсталляции...................................57 Сетевой протокол...................................................57 Тестирование сервера...............................................57 Проверка, что сервер Firebird запущен..............................58 Инсталляция встраиваемого сервера......................................61 Пример структуры встроенной инсталляции............................62 Другие вещи, которые вам нужно знать...................................62 Пользователи.......................................................62 Инструмент администратора..........................................64 Размещение на диске по умолчанию.......................................65 Пора дальше............................................................69 Глава 2. Установка сети................................................70 Сетевые протоколы......................................................70 Именованные каналы.....................................................70 Локальный доступ.......................................................70 Клиент-сервер......................................................71 Встраиваемый сервер................................................71 Смешанные платформы....................................................72 Сетевой адрес для сервера..............................................72 Файл HOSTS............................................................ 73 Местонахождение файла HOSTS........................................73 Имя сервера и путь к нему..............................................74 Синтаксис строки соединения........................................75 Конфигурирование сервиса порта TCP/IP..................................76 Как сервер устанавливает прослушиваемый порт.......................77 Установка клиента для поиска порта сервиса.........................80 Конфигурирование файла services....................................81 Проверка соединения с помощью ping.....................................82 Если ping выдает ошибку............................................83 Проблемы с событиями............................................. 83 Другие сетевые проблемы............................................84 Пора дальше............................................................84
Оглавление 7 Глава 3. Конфигурирование Firebird.....................................85 Конфигурация на уровне базы данных.....................................85 Переменные окружения................................................. 85 Где устанавливаются переменные окружения...............................86 Windows............................................................86 POSIX..............................................................87 ISCJJSER и ISC_PASSWORD............................................87 Переменная FIREBIRD (или INTERBASE)................................87 FIREBIRDTMP........................................................88 *_LOCK и *JASG.....................................................88 ТМР................................................................88 Файл конфигурации Firebird.........................................89 Изменение параметров конфигурации..................................89 Пора дальше............................................................93 Глава 4. Основные операции.............................................94 Запуск Firebird на Linux/UNIX..........................................94 Суперсервер........................................................94 Классический сервер................................................96 Запуск сервера Firebird в Windows......................................98 Суперсервер........................................................98 Выполнение Firebird как сервиса в Windows NT, 2000 и ХР............99 Апплеты Firebird Manager..........................................100 Выполнение Firebird как приложения на платформах Windows..............100 Запуск сервера как приложения вручную.............................101 Останов сервера...................................................102 Алиасы базы данных....................................................103 aliases.conf......................................................103 Переносимость.....................................................103 У правление доступом..............................................104 Администрирование баз данных..........................................105 fbmgr/ibmgr.......................................................105 instsvc.exe.......................................................106 gbak..............................................................106 gsec..............................................................106 gfix..............................................................106 gstat.............................................................107 fb Jock print.....................................................107 Введение в isql.......................................................107 Запуск isql.......................................................107 Использование isql................................................107 Оператор CONNECT..................................................108 Создание базы данных с использованием isql........................109 Оператор CREA ТЕ DATABASE.........................................109 Пора дальше...........................................................110
8 Оглавление ЧАСТЬ II. КЛИЕНТ-СЕРВЕР...............................................111 Глава 5. Введение в архитектуру клиент-сервер.........................113 Базы данных клиент-сервер в сравнении с файл-серверами................114 Характеристики СУБД клиент-сервер.....................................114 Масштабируемость..................................................114 Функциональная совместимость......................................115 Защита данных.....................................................115 Распределение функций.............................................115 Двухуровневая модель..............................................116 Многоуровневая модель.............................................117 Стандартизация....................................................117 Проектирование систем клиент-сервер...................................118 Абстракция хранимых данных........................................118 "Руки прочь" от доступа к данным..................................122 Множество пользователей и параллельность..........................122 Пора дальше...........................................................123 Глава 6. Сервер Firebird..............................................124 Роль сервера..........................................................125 Платформы для операционных систем.....................................125 Примеры топологий.....................................................126 Двухуровневая архитектура клиент-сервер...........................126 Однопользовательская модель.......................................127 Серверы Firebird в среде DTP......................................128 Терминальные серверы..............................................130 Базы данных...........................................................130 Программирование на стороне сервера...................................131 Хранимые процедуры................................................131 Триггеры..........................................................131 Функции, определенные пользователем...............................132 Приложения, работающие с несколькими базами данных................132 Безопасность сервера..................................................132 Безопасность базы данных..............................................133 Пора дальше...........................................................133 Глава 7. Клиенты Firebird.............................................134 Что такое клиент Firebird?............................................134 Клиентская библиотека Firebird........................................135 Разработка приложений.................................................136 Динамические приложения клиент-сервер.............................136 Ядро API Firebird.................................................137 Встроенные приложения Firebird....................................138 Сервисы API.......................................................140
Оглавление 9 Инсталляция клиентов................................................140 Инсталляция клиента Linux/UNIX..................................141 Инсталляция клиента Windows.....................................142 Список имен и размещение клиентской библиотеки..................148 Пора дальше.........................................................149 ЧАСТЬ III. ТИПЫ ДАННЫХ FIREBIRD И ДОМЕНЫ............................151 Глава 8. О типах данных Firebird....................................153 Где задаются типы данных............................................153 Поддерживаемые типы данных..........................................153 Булевы типы данных..................................................154 "Диалекты" SQL......................................................154 Идентификаторы с разделителями в SQL-92.............................154 Контекстные переменные..............................................155 Временные значения..............................................156 Примеры использования...........................................157 Предопределенные литералы даты......................................157 Примеры использования предопределенных литералов даты...........158 Столбцы........................................................... 158 Домены..............................................................158 Преобразование типов данных.........................................159 Неявное преобразование типов....................................159 Явное преобразование типов: CASTQ...............................160 Изменение определения столбцов и доменов............................160 Изменение типа данных столбца...................................161 Изменение типа данных домена....................................161 Ключевые слова, используемые для спецификации типа данных...........161 Специальная тема миграции: диалекты SQL.............................162 ODS и диалект...................................................162 Где учитывается диалект.........................................164 Как определять диалект..........................................165 Пора дальше.........................................................166 Глава 9. Числовые типы данных.......................................167 Операции с числовыми типами.........................................168 Целые типы..........................................................168 SMALLINT........................................................169 INTEGER.........................................................169 BIGINT, NUMERIC(I8,0)...........................................169 Автоинкремент или тип IDENTITY..................................170 Генераторы......................................................170 Масштабируемые типы с фиксированной точкой..........................172 Тип данных NUMERIC..............................................173 Тип данных DECIMAL..............................................174
10 Оглавление Конвертированные базы данных....................................174 Специальные ограничения в статическом SQL.......................174 Поведение типов с фиксированной точкой в операциях..............175 Числовой ввод и показатели степени..................................178 Типы данных с плавающей точкой......................................178 FLOAT...........................................................180 DOUBLE PRECISION................................................180 Пора дальше.........................................................181 Глава 10. Типы даты и времени.......................................182 DATE................................................................182 TIMESTAMP...........................................................182 Доли секунды....................................................183 TIME................................................................183 Интервал времени................................................183 Литералы даты.......................................................183 Распознаваемые форматы литералов даты и времени.....................184 "Скользящее окно века" в Firebird...............................185 Разделители в неамериканских датах..............................186 Пробелы в литералах даты........................................186 Заключение в апострофы литералов даты...........................186 Литералы месяца.................................................187 Примеры литералов даты..........................................187 Предварительно определенные литералы даты...........................187 Неявное преобразование типов в литералах даты и времени.............188 Контекстные переменные даты и времени...............................189 Операции, использующие значения даты и времени......................190 Общие правила для операций......................................191 Выражения в качестве операндов..................................191 Использование CASTQ с типами дата/время.............................192 Преобразование между типами дата/время..........................192 Преобразование типов даты в CHAR(n) и VARCHAR(n)................193 Преобразования между типами дата/время и другими типами данных..195 Использование преобразований....................................195 Функция EXTRACTQ....................................................196 Синтаксис.......................................................196 Объединение EXTRACTQ с другими функциями........................197 Понимание функции EXTRACTQ......................................199 Пора дальше.........................................................200 Глава 11. Символьные типы данных....................................201 Основы использования строк..........................................201 Ограничитель строки.............................................201 Конкатенация....................................................202 Управляющие символы.............................................202
Оглавление 11 Ограничения символьных типов....................................203 Символьные данные фиксированной длины...........................203 CHAR(n), алиас для CHARACTER(n).................................204 NCHAR(n), алиас для NATIONAL CHARACTER(n).......................204 Символьные данные переменной длины..............................204 Наборы символов и последовательность сортировки.....................205 Набор символов клиента..........................................206 Переопределение набора символов.................................207 Наборы символов Firebird........................................208 Набор символов для клиентского соединения.......................213 Специальные наборы символов.....................................214 Последовательности сортировки...................................215 Пользовательские наборы символов и сортировки...................218 Пора дальше.........................................................220 Глава 12. BLOB и массивы............................................221 ТипыбСОЙ............................................................221 Поддерживаемые типы BLOB........................................222 Сегменты BLOB...................................................223 Операции с полями BLOB..........................................224 Когда использовать типы BLOB....................................225 Типы массивов.......................................................226 Типы ARRAY и SQL.............................................. 226 Когда использовать тип массива..................................227 Подходящие типы элементов.......................................227 Определение массивов............................................227 Многомерные массивы.............................................227 Хранение столбцов массивов......................................228 Доступ к данным массива.........................................229 Ограничения доступа динамического SQL...........................230 Пора дальше.........................................................230 Глава 13. Домены....................................................231 Создание домена.....................................................232 Идентификатор домена.......................................... 232 Тип данных домена...............................................232 Атрибут DEFAULT.................................................233 Атрибут NOT NULL................................................234 Условия CHECK...................................................234 Атрибут CHARSET/CHARACTER SET...................................237 Атрибут COLLATE.................................................237 Использование доменов в определении столбца.........................238 Пример..........................................................238 Переопределения в доменах.......................................238 Когда домены не работают........................................240
12 Оглавление Объявление домена BOOLEAN...........................................240 Изменение определения домена........................................240 Примеры.........................................................241 Ограничения на изменение типов данных...........................241 Удаление домена.....................................................242 Пора дальше....................................................... 242 ЧАСТЬ IV. БАЗА ДАННЫХ И ЕЕ ОБЪЕКТЫ..................................243 Глава 14. Чертежная доска для базы данных...........................245 Пользователь SYSDBA и пароль........................................245 Метаданные..........................................................245 Язык определения данных.........................................246 Системные таблицы...............................................246 Проектирование базы данных..........................................246 Описание и анализ...............................................247 Модель данных о база данных.....................................248 Одна база данных или много?.....................................248 Физические объекты..............................................249 Соглашения по именованию объектов базы данных и ограничения.....256 Скрипты схемы.......................................................258 Скрипты Firebird................................................258 Зачем использовать скрипты?.....................................258 Что находится в скриптах DDL?...................................259 Основные шаги...................................................262 Управление скриптами вашей схемы................................265 Пора дальше.........................................................267 Глава 15. Создание и ведение базы данных............................268 Физическое хранение базы данных ....................................268 Размещение......................................................268 Безопасность доступа................................................269 ISCJJSER и ISCJPASSWORD.........................................269 Создание базы данных................................................270 Диалект.........................................................270 Обязательные и необязательные атрибуты..........................271 Получение информации о базе данных..............................273 Базы данных из одного и нескольких файлов...........................274 Задание размера файла для однофайловой базы данных..............275 Создание многофайловой базы данных..................................275 Изменение базы данных...........................................276 Кэш базы данных.....................................................277 Ограничения и значения по умолчанию.............................278 Вычисление размера кэша.........................................279
Оглавление 13 Установка размера кэша на уровне базы данных......................280 Изменение значений по умолчанию для сервера.......................282 Проверка размера кэша.............................................283 Базы данных только для чтения.........................................283 Внешние файлы.....................................................284 Преобразование базы данных в режим только для чтения..............284 Теневые копии базы данных.............................................285 Преимущества и ограничения теневого копирования...................285 Реализация теневого копирования...................................286 Создание теневой копии............................................288 Увеличение размера теневой копии..................................291 Удаление теневой копии............................................291 "Гигиена" базы данных.................................................292 Фоновая сборка мусора.............................................292 Сборка мусора в процессе резервного копирования...................293 Проверка и ремонт.................................................293 Удаление базы данных..................................................297 Синтаксис.........................................................297 Пора дальше...........................................................297 Глава 16. Таблицы.....................................................298 О таблицах Firebird...................................................298 Структурные описания..............................................298 Создание таблиц.......................................................298 Владение таблицами и привилегии...................................299 Оператор CREATE TABLE.............................................299 Ограничения...........................................................305 Ограничения целостности...........................................306 Ссылочное ограничение.............................................306 Именованные ограничения...........................................306 Ограничения целостности...............................................307 Ограничение NOT NULL..............................................307 Ограничение PRIMARY KEY...........................................307 Ограничения CHECK.................................................314 Ограничения UNIQUE................................................316 Использование внешних файлов в качестве таблиц........................317 Синтаксис для CREATE TABLE...EXTERNAL FILE........................317 Импорт внешних файлов в таблицы Firebird..........................320 Экспорт таблиц Firebird во внешние файлы..........................322 Конвертирование внешних таблиц во внутренние......................323 Изменение таблиц......................................................323 Подготовка к выполнению ALTER TABLE...............................323 Изменение столбцов в таблице......................................324 Удаление столбцов.................................................325 Удаление ограничений..............................................326
14 Оглавление Добавление столбца................................................327 Когда недостаточно ALTER TABLE....................................328 Удаление таблицы......................................................329 DROP TABLE........................................................329 RECREATE TABLE....................................................330 Временные таблицы.....................................................330 Постоянные "временные" таблицы....................................330 Пора дальше...........................................................331 Глава 17. Ссылочная целостность данных................................332 Терминология..........................................................333 Ограничение FOREIGN KEY...............................................333 Реализация ограничения............................................334 Действия триггеров по изменению правил целостности................336 Взаимодействие ограничений............................................337 Триггеры действий пользователя........................................338 Таблицы соответствия и ваша модель данных.............................339 Привилегии на ссылки..................................................341 Обработка других видов отношений......................................342 Отношение один-к-одному...........................................342 Отношение многие-ко-многим........................................343 Ссылающиеся на себя отношения.....................................346 Обязательные отношения............................................347 Ошибка "объект находится в использовании".............................347 Пора дальше...........................................................348 Глава 18. Индексы.....................................................349 Ограничения...........................................................349 Автоматические индексы в сравнении с определенными пользователем индексами.............................................................350 Импорт существующих индексов..................................... 350 Направленные индексы..............................................350 Планы запросов........................................................351 Как могут помочь индексы..............................................351 Сортировка и группирование........................................352 Соединения........................................................352 Сравнения.........................................................352 Что индексировать.....................................................352 Когда индексировать...................................................353 Использование CREATE INDEX............................................354 Обязательные элементы.............................................354 Необязательные элементы...........................................355 Индексы для нескольких столбцов.......................................356 Предикаты OR в запросах...........................................357 Критерии поиска...................................................357
Оглавление 15 Просмотр индексов....................................................358 Изменение индекса....................................................358 Активация/деактивация............................................358 Изменение структуры индекса......................................359 Удаление индекса.....................................................359 Ограничения......................................................359 Тема оптимизации: оптимальное индексирование.........................360 Действия по обслуживанию индексов................................360 Улучшение селективности индекса..................................360 Получение статистики по индексу..................................364 Интерфейс gstat..................................................365 Другие переключатели gstat.......................................371 Пора дальше..........................................................377 ЧАСТЬ V. FIREBIRD SQL................................................379 Глава 19. Язык SQL в Firebird........................................381 Firebird и стандарты.................................................381 Операторы SQL.......................................................382 Язык определения данных (DDL)....................................383 Язык манипулирования данными (DML)...............................383 Возможности встраиваемого языка (ESQL)...........................383 Динамический в сравнении со статическим SQL......................384 Интерактивный SQL (ISQL).........................................385 Процедурный язык (PSQL)..........................................385 Диалекты SQL.........................................................385 Ресурсы SQL.........................................................;386 Книги............................................................386 Свободная поддержка SQL..........................................387 Пора дальше..........................................................387 Глава 20. Запросы DML................................................388 Наборы данных........................................................388 Таблица является набором.........................................388 Выходные наборы..................................................389 Кардинальное число и положение...................................389 Входные наборы...................................................390 Выходные наборы в качестве входных наборов.......................390 Наборы курсора...................................................391 Вложенные наборы.................................................392 Привилегии...........................................................393 Оператор SELECT......................................................393 Предложения в операторе SELECT...................................394 Запросы, подсчитывающие строки...................................403
16 Оглавление Оператор INSERT......................................................405 Добавление данных в столбцы BLOB.................................406 Использование INSERT для автоматических полей....................406 Оператор UPDATE......................................................409 Позиционированные операции в сравнении с поисковыми..............409 Использование оператора UPDATE...................................410 Оператор DELETE......................................................412 Оператор EXECUTE.....................................................412 Запросы, которые вызывают хранимые процедуры.........................413 Выполняемые процедуры............................................413 Процедуры выбора.................................................413 Использование параметров.............................................414 Замечания для пользователей Delphi...............................415 Пакетные операции....................................................416 Пакетные добавления..............................................416 Операции DML и события изменения состояния...........................417 Предложения действия ссылочной целостности.......................417 Пользовательские триггеры........................................417 Пора дальше..........................................................419 Глава 21. Выражения и предикаты......................................420 Выражения............................................................420 Предикаты............................................................421 Где проверяется истинность.......................................422 Утверждения......................................................422 Решение, что является истинным...................................423 Символы, используемые в выражениях...................................424 Операторы SQL....................................................... 426 Приоритет операторов.............................................426 Оператор конкатенации............................................427 Арифметические операции..........................................427 Операторы сравнения..............................................428 Другие предикаты сравнения.......................................429 Логические операторы.............................................432 Предикат IS [NOT] NULL...........................................433 Предикаты существования..........................................433 Обсуждение NULL......................................................437 NULL в выражениях................................................437 NULL в вычислениях...............................................438 Понимание истинности и ложности..................................438 NULL и внешние функции (UDF).....................................439 Установка значения в NULL........................................439 Использование выражений..............................................440 Вычисляемые столбцы..............................................440 Определение столбцов COMPUTED BY.................................446
Оглавление 17 Условия поиска....................................................446 Условия упорядочения и группирования..............................448 Выражения CHECK в DDL.............................................449 Выражения в PSQL..................................................449 Вызовы функций........................................................450 Внутренние функции SQL.......................................... 450 Внешние функции (UDF).............................................456 Пора дальше...........................................................461 Глава 22. Запросы к множеству таблиц..................................462 Виды многотабличных запросов..........................................462 Соединения............................................................463 Подзапросы.......................................................... 463 Запросы UNION.........................................................463 Соединения............................................................463 Внутреннее соединение.................................................464 Синтаксис неявного INNER JOIN в SQL-89............................465 Синтаксис явного INNER JOIN в SQL-92............................ 465 Смешивание неявного и явного синтаксисов..........................467 Внешние соединения....................................................467 LEFT OUTER JOIN...................................................467 RIGHT OUTER JOIN..................................................468 FULL OUTER JOIN...................................................469 Перекрестные соединения...............................................470 Естественные соединения...............................................470 Двусмысленность в запросах JOIN.......................................470 Алиасы таблиц.........................................................471 Допустимые имена алиасов таблиц...................................472 Внутренний курсор.....................................................472 Реентерабельные соединения............................................473 Курсоры для реентерабельных соединений............................473 Подзапросы............................................................475 Задание столбца при использовании подзапроса..........................475 Коррелированные подзапросы........................................476 Подзапрос или соединение?....................................... 476 Поиск с использованием подзапроса.....................................477 Реентерабельные подзапросы........................................477 Добавление данных с использованием подзапроса с соединениями..........478 Оператор UNION........................................................478 Наборы, совместимые для объединения...................................479 Использование столбцов времени выполнения в объединениях..............480 Условия поиска и упорядочивания.......................................481 Реентерабельные запросы UNION..................................:......481 UNION ALL.............................................................482
18 Оглавление Темы оптимизации: планы запросов и оптимизатор......................482 Планы и оптимизатор запросов Firebird...........................482 Улучшение плана запроса.........................................494 Пора дальше.........................................................498 Глава 23. Упорядоченные и агрегатные наборы.........................499 Обсуждение сортировки...............................................499 Задание порядка в предложениях сортировки.......................499 Временное пространство сортировки...............................500 Индексирование..................................................501 Предложение ORDER BY................................................501 Элементы сортировки.............................................502 Направление сортировки..........................................505 Размещение пустых значений......................................505 Предложение GROUP BY................................................506 Список группируемых полей..................................... 506 Группирующий элемент............................................508 Подвыражение НА VING............................................511 Подвыражение COLLATE............................................512 Использование ORDER BY в группирующем запросе...................512 Улучшенные условия группирования................................512 Пора дальше.........................................................515 Глава 24. Просмотры.................................................516 Что такое просмотр?.................................................516 Ключи и индексы.................................................516 Упорядочение и группирование строк..............................517 Некоторые простые спецификации просмотров.......................517 Почему просмотры могут быть полезными...........................518 Привилегии......................................................518 Создание просмотров.................................................519 Оператор CREATE VIEW............................................520 Просмотры только для чтения и изменяемые............................524 Просмотры только для чтения.....................................524 Естественно изменяемые просмотры................................526 Изменение поведения изменяемых просмотров.......................526 Изменить определение просмотра?.....................................527 Удаление просмотра..................................................527 Использование просмотров в SQL......................................527 Использование планов запросов для просмотров........................528 Другие наследуемые таблицы..........................................530 Хранимые процедуры выбора.......................................530 Внешние виртуальные таблицы.....................................531 Пора дальше.........................................................532
Оглавление 19 ЧАСТЬ VI. ТРАНЗАКЦИИ...................................................533 Глава 25. Обзор транзакций Firebird....................................535 Свойства ACID..........................................................536 Атомарность........................................................536 Согласованность....................................................536 Изолированность....................................................536 Устойчивость.......................................................537 Контекст транзакции....................................................537 Одна транзакция, много запросов....................................537 Транзакции и MGA.......................................................539 Пересылка в сравнении с COMMIT.....................................539 Откат..............................................................539 Блокировка строки..................................................540 Блокировка на уровне таблицы.......................................541 Добавление.........................................................542 "Старение" и статистика транзакций.....................................542 Идентификатор и возраст транзакции.................................542 "Заинтересованные транзакции"......................................543 OIT и ОЛТ должны постоянно изменяться..............................546 Условия для изменения ОТТ и ОАТ....................................547 Чистка в сравнении со сборкой мусора...............................548 Статистика транзакций..................................................549 gstat..............................................................549 isql...............................................................550 Что может рассказать вам статистика................................550 Пора дальше............................................................551 Глава 26. Конфигурирование транзакций..................................552 Параллельность.........................................................552 Факторы, влияющие на параллельность................................552 Уровень изоляции...................................................553 Способ доступа.....................................................556 Способ разрешения блокировок ("Режим блокировок")..................556 Резервирование таблиц..............................................557 Версии записей.........................................................560 Зависимые строки...................................................561 Блокировки и конфликты блокировок......................................561 Время действия.....................................................561 Конфликты блокировки...............................................562 Что такое взаимная блокировка?.....................................563 Пора дальше............................................................564
20 Оглавление Глава 27. Программирование с транзакциями...........................565 Язык для транзакций.................................................565 ESQL............................................................565 API.............................................................566 Запуск транзакции...................................................566 SQL.............................................................566 API.............................................................568 Доступ к идентификатору транзакции..................................570 Использование TID в приложениях.................................571 Процесс выполнения транзакции.......................................571 Вложенные транзакции................................................571 Пользовательские точки сохранения...............................572 Логический контекст.................................................575 Завершение транзакций...........................................575 Диагностирование исключений.....................................578 Транзакции для нескольких баз данных................................580 Зависшие транзакции.............................................581 Ограниченные базы данных........................................581 Пессим истическая блокировка...................................... 582 Блокировка на уровне таблицы....................................582 Блокировка на уровне оператора..................................583 Хранимые процедуры, триггеры и транзакции...........................588 Хранимые процедуры..............................................588 Триггеры........................................................588 "Точки сохранения" в PSQL.......................................588 Советы по оптимизации поведения транзакции..........................589 Выбор подходящей модели транзакции..............................589 Не переходите к "общему" пока вам это не понадобилось...........589 Использование возможностей множества транзакций.................589 Сохраняйте передвижение ОАТ.....................................589 Пора дальше.........................................................590 ЧАСТЬ VII. ПРОГРАММИРОВАНИЕ НА СЕРВЕРЕ..............................591 Глава 28. Введение в программирование в Firebird....................593 Обзор модулей сервера...............................................593 Хранимые процедуры..................................................594 Преимущества использования хранимых процедур....................595 Триггеры............................................................595 Преимущества использования триггеров............................596 Триггеры в качестве автоинкрементного механизма.................596 Триггеры и транзакции...........................................596 Расширения языка PSQL...............................................597 Ограничения PSQL................................................597 Типы операторов, не поддерживаемых в PSQL.......................598
Оглавление 21 Исключения...................................................................598 События......................................................................599 Безопасность.................................................................599 Внутреннее устройство технологии.........................................600 Эффекты изменений........................................................600 Пора дальше..................................................................601 Глава 29. Разработка модулей PSQL............................................602 Элементы процедур и триггеров................................................602 Оператор CREATE....................................................................................................602 Элементы заголовка.......................................................605 Элементы тела............................................................605 Элементы языка...........................................................606 Программные конструкции......................................................608 Блоки BEGIN... END.......................................................608 Условные блоки...........................................................609 Переменные...............................................................611 Операторы SELECT... INTO.................................................616 Операторы управления потоком.............................................619 EXECUTE STA ТЕМ ENT......................................................620 POST_EVENT...............................................................623 Разработка модулей...........................................................623 Добавление комментариев..................................................623 Чувствительность к регистру и пробелы....................................623 Управление вашим кодом...................................................624 Компиляция хранимых процедур и триггеров.................................625 Удаление исходных текстов модулей........................................627 Пора дальше..................................................................628 Глава 30. Хранимые процедуры................................................ 629 Выполняемые хранимые процедуры...............................................629 Хранимые процедуры выбора....................................................629 Создание хранимых процедур...................................................630 Элементы заголовка.......................................................630 Элементы тела............................................................631 Выполняемые процедуры........................................................633 Сложная обработка........................................................634 Поддержка "живых" клиентских наборов.....................................634 Операции в выполняемых процедурах........................................634 Многотабличные процедуры.................................................635 Конструкция SELECT... INTO...............................................636 Использование (вызов) выполняемых процедур...............................638 Рекурсивные процедуры....................................................639 Курсоры в PSQL...........................................................641
22 Оглавление Хранимые процедуры выбора.............................................642 Использование процедур выбора.....................................642 Техника...........................................................644 Конструкция FOR SELECT... DO......................................644 Простая процедура с вложенными операторами SELECT.................646 Вызов процедуры выбора............................................647 Вложенные процедуры...............................................648 Процедура с промежуточными итогами................................652 Просмотр массива в хранимой процедуре.............................654 Тестирование процедур.............................................656 Процедуры для совместного использования...............................656 Изменение хранимых процедур...........................................656 Влияние на приложения.............................................657 Синтаксис изменения процедур......................................657 Удаление хранимых процедур............................................660 Ограничения.......................................................660 Тема оптимизации: использование внутренних возможностей...............661 Относительно RDBSDBKEY............................................661 RDBSDBKEY в многотабличных наборах................................665 Пора дальше...........................................................666 Глава 31. Триггеры....................................................667 Фаза, событие и последовательность....................................667 Фаза и событие........................................................667 Последовательность................................................668 Состояние.............................................................669 Создание триггеров......................................,.............669 Синтаксис.........................................................670 Элементы заголовка................................................670 Тело триггера.....................................................671 Особенности PSQL для триггеров........................................671 Переменные события................................................672 Переменные NEW и OLD..............................................672 Изменение других таблиц...............................................678 Поддержание обязательного отношения...............................678 Поддержка ссылочной целостности...................................681 Изменение строк в той же таблице..................................686 Изменение триггеров...................................................687 Синтаксис для изменения триггеров.................................687 Удаление триггеров....................................................689 Пора дальше...........................................................689 Глава 32. Обработка ошибок и события..................................690 Типы исключений.......................................................690 Что такое исключение?.............................................690 Создание исключения............................................. 691
Оглавление 23 Исключения в действии.................................................... 692 Обработка исключений.................................................... 693 Оператор WHEN........................................................ 693 Вложенные исключения в качестве точек сохранения......................696 Обработка исключения REASSIGN SALES............................................................696 Протокол ошибок.......................................................698 Исключения в триггерах................................................700 Сообщения исключений во время выполнения..................................701 Список кодов ошибок.......................................................702 Написание вашего собственного списка кодов ошибок.....................702 События...................................................................704 Использование сообщений о событиях....................................704 Элементы механизма....................................................705 Синхронное прослушивание..............................................706 Асинхронная сигнализация..............................................708 Асинхронное прослушивание.............................................709 Использование POST_EVENT..............................................710 Пора дальше...............................................................711 ЧАСТЬ VIII. БЕЗОПАСНОСТЬ..................................................713 Глава 33. Безопасность в операционной среде...............................715 Физическая безопасность...................................................715 Использование защищенных файловых систем..............................716 Защита оперативных копий..............................................716 Защита, основанная на возможностях платформы..............................717 Ограничение подключения к операционной системе........................717 POSIX.................................................................717 Платформы Microsoft Windows...........................................718 Выполнение произвольного кода.............................................719 Firebird 1.0.^........................................................720 Firebird 1.5..........................................................720 Безопасность сетевого соединения..........................................721 Web и другие многозвенные серверные приложения............................721 Использование выделенных серверов.....................................722 Использование средств межсетевой защиты...............................722 Отражение атак........................................................722 Пора дальше...............................................................722 Глава 34. Защита сервера................................................ 723 Ввод учетных данных пользователя..........................................723 Шифрование пароля.....................................................724 Учет пользователей в SQL..............................................725 Пользователь SYSDBA.......................................................725 Слабое место POSIX........................................................725
24 Оглавление Утилита gsec...........................................................726 Запуск интерактивной сессии gsec...................................727 Использование gsec из командной строки.............................730 Сообщения об ошибках gsec..........................................731 Специальная тема: настройка безопасности пользователя..................732 База данных безопасности...........................................732 Предоставление пользователям возможности изменять свой собственный пароль.............................................................733 Как спрятать список пользователей/паролей..........................734 Как запротоколировать попытки соединения с базой данных............735 Как остановить злоумышленников.....................................737 Пора дальше............................................................738 Глава 35. Безопасность на уровне базы данных...........................739 Безопасность и доступ по умолчанию.....................................739 А теперь плохие новости............................................739 Привилегии............................,................................741 Упаковка привилегий................................................741 Объекты................................................................742 Ограничения привилегий.............................................743 Пользователи...........................................................743 Специальные пользователи...........................................744 Пользователь PUBLIC................................................744 Предоставление привилегий..............................................745 Права UPDATE к столбцам............................................745 Права REFERENCES к столбцам........................................746 Привилегии к объектам..............................................747 Множество привилегий и множество получателей привилегий............748 Привилегии через роли..................................................750 Создание роли......................................................751 Назначение привилегий роли.........................................751 Предоставление роли пользователям..................................751 Подключение к базе данных с использованием роли....................751 Удаление роли......................................................752 Предоставление прав на предоставление привилегий.......................752 Неожиданные эффекты................................................753 Отмена полномочий......................................................754 Использование REVOKE...............................................755 Отмена привилегий у нескольких пользователей.......................756 Отмена права предоставлять привилегии..................................758 Скрипты безопасности...................................................759 Создание скрипта...................................................759 Инсталляция полномочий непосредственно из процедуры................762 Пора дальше............................................................763
Оглавление 25 Глава 36. Конфигурация и специальные возможности....................764 Сравнение архитектуры Суперсервера и Классического сервера..........764 Выполняемые программы и процессы................................764 Управление блокировками.........................................765 Использование ресурсов..........................................765 Локальный доступ................................................766 Файл конфигурации Firebird..........................................767 Параметры.......................................................767 Параметры для конфигурирования временного пространства для сортировки.769 Параметры, связанные с ресурсами................................771 Параметры, связанные с коммуникацией............................773 Работа со встроенным сервером.......................................781 Запуск встроенного сервера..........................................781 Приложения..........................................................781 Размещение и переименование библиотеки..........................782 Жестко закодированные пути к базе данных........................782 Утилиты удаленных сервисов......................................783 Вопросы безопасности сервера....................................783 Совместимость нескольких серверов...................................784 Останов встроенного сервера.........................................784 Модули внешних кодов................................................785 Разработка ваших собственных UDF....................................785 Написание модуля функции........................................786 Фильтры BLOB........................................................792 Написание фильтров BLOB.........................................793 Объявление фильтров BLOB........................................793 Вызов фильтров BLOB.............................................794 Инструменты для написания фильтров..............................794 Модули интернациональных языков.....................................795 Конфигурирование внешних размещений.................................795 Установки в файле конфигурации......................................795 UDFAccess.......................................................796 Пора дальше.........................................................798 ЧАСТЬ IX. ИНСТРУМЕНТЫ...............................................799 Глава 37. Интерактивный SQL (утилита isql)..........................801 Интерактивный режим.................................................801 Текстовый редактор по умолчанию.................................801 Запуск isql.....................................................802 Соединение с базой данных.......................................803 Символ терминатора..............................................805 Продолжение строки подсказки....................................805 Транзакции в isql...............................................805
26 Оглавление Поиск в буфере строк..............................................806 Использование предупреждений......................................807 Обработка исключений..............................................807 Установка в isql диалекта.........................................807 Интерактивные команды.................................................808 Создание и изменение объектов базы данных.........................809 Общие команды isql....................................................809 Команды SHOW..........................................................813 Команды SET......................................................... 820 Выход из интерактивной сессии isql................................826 Командный режим.......................................................826 Выполнение isql в командном режиме................................826 Переключатели командной строки....................................827 Извлечение метаданных.................................................828 Использование isql -extract.......................................829 Использование isql -a.............................................829 Пора дальше...........................................................830 Глава 38. Резервное копирование и восстановление баз данных (gbak).....................................................831 Файлы gbak............................................................831 Другие таланты gbak...............................................832 Обновление структуры на диске (ODS)...............................833 Права на выполнение копирования и восстановления базы данных......834 Изменение владельца базы данных...................................834 Имя пользователя и пароль.........................................834 Выполнение копирования................................................835 Аргументы для gbak-b[ackup].......................................835 Переключатели копирования.........................................836 Переносимые копии.................................................838 Копирование в один файл...........................................838 Копирование многофайловой базы данных во множество файлов.........838 Копирование только метаданных.....................................839 Выполнение удаленного копирования.................................840 Решение вопросов безопасности.....................................840 Возвращаемые коды и ответная реакция..............................840 Выполнение восстановления.............................................841 Аргументы gbak для восстановления.................................841 Переключатели восстановления......................................841 Восстанавливать или создавать?....................................843 Объекты, определенные пользователем...............................844 Восстановление в один файл........................................844 Многофайловое восстановление......................................844 Возвращаемые коды и ответная реакция..............................845 Размер страницы и размер кэша по умолчанию........................845
Оглавление 27 Использование gbak с Менеджером сервисов Firebird......................846 Восстановление в POSIX.............................................847 Копирование........................................................847 Восстановление.....................................................848 Сообщение об ошибках gbak..............................................848 Пора дальше............................................................855 Глава 39. Утилита gfix.................................................856 Использование gfix.....................................................856 Получение доступа к базе данных из gfix............................857 Чистка базы данных.....................................................857 Сборка мусора......................................................858 Интервал чистки....................................................858 Выполнение ручной чистки...........................................860 Закрытие базы данных...................................................860 Закрытие базы данных перед остановом сервера.......................861 Команда gfix —shut.................................................861 Изменение установок базы данных........................................863 Установка размера кэша по умолчанию................................863 Изменение режима доступа...........................................864 Изменение диалекта базы данных.....................................864 Включение и отключение "использовать все пространство".............864 Включение и отключение синхронного вывода..........................865 Запрос версии сервера Firebird.....................................866 Проверка и починка данных..............................................867 Когда проверять базу данных........................................867 Выполнение проверки базы данных....................................867 Восстановление разрушенной базы данных.............................868 Восстановление транзакций..............................................868 Двухфазное подтверждение...........................................868 Восстановление транзакции..........................................869 Теневые копии..........................................................870 Активизация теневой копии..........................................870 Удаление недоступных теневых копий.................................871 Список переключателей gfix.............................................871 Сообщения об ошибках gfix..............................................873 Пора дальше............................................................874 Глава 40. Менеджер блокировок..........................................875 Менеджер блокировок Firebird...........................................876 Состояния блока....................................................876 Таблица блокировок.................................................877 Утилита Lock Print.....................................................879 Статичные отчеты...................................................881 Интерактивные отчеты...............................................881 Вывод отчета в файл................................................881
28 Оглавление Простое использование Lock Print................................882 Интерактивная выборка...........................................899 Установка конфигурации блокировки...................................900 Файлы конфигурации..............................................900 ПРИЛОЖЕНИЯ..........................................................903 Приложение 1. Список внешних функций................................905 Функции условной логики.............................................905 Математические функции..............................................908 Функции даты и времени..............................................915 Строковые и символьные функции......................................924 Функции BLOB........................................................931 Тригонометрические функции..........................................936 Подпрограммы форматирования данных..................................940 Приложение 2. Решение сетевых проблем...............................943 Можете ли вы вообще соединиться с базой данных?.....................943 Можете ли вы соединиться с базой данных в локально закольцованном варианте?.944 Прослушивает ли сервер порт Firebird?...............................945 Вы получили ошибку, хотя сервис выполняется?........................945 Находится ли база данных на физически локальном диске?..........945 Правильные ли имя пользователя и пароль?........................946 Имеет ли владелец серверного процесса достаточно полномочий для открытия файлов?............................................946 Может ли клиент найти хост?.....................................946 Нужно ли вам отключить автоматический набор номера для Интернета в Windows?..........................................................948 Изменить порядок сетевых адаптеров..............................948 Изменение конфигурации Internet Explorer........................949 Запретить авто дозвон через реестр..............................949 Запретить автодозвон RAS........................................949 Все еще есть проблемы?..............................................949 Приложение 3. Интерфейсы приложений.................................950 Драйверы JayBird JDBC...............................................950 ODBC................................................................951 Драйвер Firebird ODBC/JDBC......................................951 Другие драйверы ODBC............................................952 Firebird .NET Provider..............................................953 1BPP для разработки C++.............................................953 Delphi, Kylix и Borland C++ Builder.................................954 IB Objects......................................................954 FIBPlus.........................................................955 Другие..........................................................956
Оглавление 29 PHP.........................................................................957 Python......................................................................958 Perl...............................'........................................959 Приложение 4. Как выполнять ремонт базы данных..............................960 Восемь шагов восстановления.................................................960 Получение исключительного доступа.......................................960 Создание копии работающего файла........................................961 Выполнение проверки.....................................................961 Исправление разрушенных страниц.........................................962 Проверка после исправления mend.......................................................................962 Очистка и восстановление базы данных....................................962 Восстановление очищенной резервной копии в качестве новой базы данных...963 Проверка восстановленной базы данных...............................,....963 Как поступать, если проблемы остались.......................................963 Приложение 5. Инструменты администрирования.................................965 Графические инструменты администратора......................................965 Database Workbench......................................................965 IBExpert................................................................965 BlazeTop.............................................................. 966 IBAccess................................................................966 IBAdmin.................................................................967 1BSQL...................................................................967 IBOConsole..............................................................967 Инструменты резервного копирования..........................................968 DBak....................................................................968 gbak BackupRunner.......................................................968 Time To Backup..........................................................969 Разное......................................................................969 Инструменты починки базы данных IBSurgeon...............................969 Анализатор статистики IBAnalyst.........................................969 Interbase DataPump......................................................970 Advanced Data Generator для Firebird....................................970 Менеджеры полномочий....................................................970 Где посмотреть информацию о других инструментах.............................971 Приложение 6. Пример базы данных............................................972 Создание базы данных Employee с помощью скриптов............................972 Приложение 7. Ограничения Firebird..........................................974 Приложение 8. Наборы символов и порядков сортировки.........................980
30 Оглавление Приложение 9. Системные таблицы и просмотры.....................986 Системные таблицы...............................................986 Системные просмотры............................................1007 Приложение 10. Коды ошибок.....................................1009 Приложение 11. Зарезервированные слова.........................1065 Приложение 12. Литература и источники..........................1069 Рекомендуемая литература.......................................1069 Список Web-сайтов..............................................1070 Сайты проекта Firebird.....................................1070 Web-сайты ресурсов.........................................1070 Форумы Firebird................................................1071 Как стать разработчиком Firebird...............................1073 Глоссарий......................................................1074 Предметный указатель...........................................1098
Введение Об авторе Хелен Борри (Helen Borrie) работает по контракту инженером по программному обеспечению, по совместительству писательница и технический редактор. Она зани- мается разработкой баз данных более 20 лет, а с Firebird и его предшественниками работает с 1996 года. Хелен— активный участник сообщества онлайновой поддержки Firebird и одна из основателей FirebirdSQL Foundation Inc. Хелен живет в Австралии и общается через Интернет из своей домашней студии, расположенной среди эвкалиптов на живописном берегу Нового Южного Уэльса. О техническом редакторе Джефф Ворбойз (Geoff Worboys) занимается проектированием и разработкой прило- жений, связанных с базами данных, около 15 лет. В течение последних более 10 лет он использует Firebird, а перед этим применял его предшественника InterBase в каче- стве системы управления реляционными базами данных в разработке приложений, инструментов управления и компонентов для Delphi, С и C++ в зависимости от си- туации. Сейчас он работает в укромном офисе в Новом Южном Уэльсе, Австралия, разраба- тывая приложения как для клиентов из Австралии, так и для клиентов из других стран. Он наблюдает кенгуру и других обитателей дикой природы из своего окна, размышляя над проблемами проектирования баз данных и приложений — Интернет замечательная штука. О научном редакторе перевода на русский язык Кузьменко Дмитрий занимается проектированием и разработкой приложений баз данных уже 16 лет. С InterBase начал работать в 1994 году. В 2002 году Дмитрий ос- новал фирму iBase (www.ibase.ru), которая занимается техническим сопровождением InterBase и Firebird, а также обучением, консультациями и продажей программных продуктов. Дмитрий живет и работает в Москве, видел кенгуру только в зоопарке и по каналу Discovery и не откажется при удобном случае посетить Австралию.
32 Введение Благодарности Вот, наконец, мы с книгой по Firebird в руках! Ее написание избавило меня от других рискованных занятий в течение почти года. Я постоянно беспокоила моих хороших друзей из сообщества Firebird, так что я должна вначале поблагодарить всех их, даже если я не назову каждого по имени. У нас есть наша книга, спасибо вам. Павел Цизар (Pavel Cisar), мой давнишний друг по онлайновой поддержке из Kingdom of Geek, уделял мне свое время и опыт, выходящие за рамки его обязанно- стей. Павел был опорой издательской группы, он также давал отдельные неоценимые советы на основании опыта написания своей собственной книги по Firebird и InterBase в прошлом году (в Чехии) и его исследований внутренней работы оптими- затора запросов. Анна Харрисон (Ann Harrison)— "мать InterBase", превосходный специалист в большинстве премудростей сервера Firebird. Иван Преносил (Ivan Prenosil) щедро делился полученным им практическим опытом, а проницательность Дмитрия Серебрякова избавила меня от многих оплошностей. Клавдио Балдеррама (Claudio Valderrama Cortes) делился своим пониманием секретов rdb$db_key. Спасибо также Дэвиду Брукстоуну Шнепперу (David Brookestone Schnepper) за полезные комментарии о наборах символов и Грегори Дицу (Gregory Deatz) за предоставление мне документа по внешним функциям FreeUDFLib в приложении 1. Моему другу Джеффу Ворбойзу особая благодарность за огромную заботу и терпе- ние, которые он проявил при техническом просмотре содержания книги и многих деталей. Мы не всегда были согласны друг с другом, но книга по Firebird стала луч- ше благодаря ему. Спасибо также Дугу Чамберлину (Doug Chamberlin) и Иоане Пир- те (loana Pirtea) за их просмотр "читательскими глазами". Я также благодарна директорам компании IBPhoenix Полу Бигу (Paul Beach) и Анне Харрисон, а также моим сотрудникам за то, что помогли мне в вопросах временных задержек и финансирования книги. Предложения по книге о Firebird на английском языке получали в издательствах от- каз на протяжении более трех лет, пока Apress не взяла на себя риск и не выпустила в свет книгу по Firebird. Apress, сообщество Firebird благодарит вас за то, что услыша- ли нас. И, наконец, я должна от всего сердца от имени всех нас сказать "спасибо" разработ- чикам Firebird, чьи увлеченность, умения и самоотверженность дали нам Firebird. Kia ora! Kia manawa! Хелен Борри Апрель 2004
Введение 33 Введение в Firebird Что такое Firebird? Firebird— это мощная, компактная реляционная система управления базами данных (РСУБД) с архитектурой клиент-сервер. Она может выполняться на разнообразных серверных и клиентских платформах, включая Windows, Linux и на некоторых дру- гих платформах UNIX, включая FreeBSD и Mac OS X. Это РСУБД промышленного применения, чьи возможности имеют высокий уровень соответствия стандартам SQL, при этом она реализует некоторые мощные расширения языка процедурного программирования конкретного производителя. Кому нужна эта книга? Разработчики с некоторым опытом работы с базами данных, которые, возможно, пе- реходят на платформу клиент-сервер впервые, найдут в этой книге все необходимое, чтобы стать более продуктивными в Firebird. Несмотря на то, что это руководство не является начальным учебником по SQL или по проектированию баз данных, в нем делается акцент на практику проектирования хороших приложений на базе клиент- серверных реляционных СУБД; оно также содержит документацию по языку SQL для Firebird— определения, манипуляция, язык программирования— с большим количеством деталей, советов и примеров. Firebird— серьезный программный продукт, созданный для установки в малых и больших сетях, он также обладает некоторыми полезными возможностями для авто- номных конфигураций. Его небольшой размер дает возможность одиночным разра- ботчикам легко выполнять большие производственные разработки в домашнем офи- се. Для администратора базы данных или системного проектировщика книга дает основные сведения по инсталляции, конфигурированию, настройке, безопасности и инструментам. Мощь и высокий уровень соответствия стандартам делает Firebird привлекательной средой для изучения информационных технологий в университетах. Эта книга даст достаточный материал для студентов второго и третьего года обуче- ния компьютерным наукам для работы с Firebird. Тех кто использовал до настоящего момента Firebird 1.0.x или InterBase, книга по Firebird знакомит с расширениями языка, безопасностью и возможностями оптими- затора, которые были добавлены в версию 1.5. Где найти нужную вам информацию? Часть I является "учебным лагерем" для новичков в Firebird. Здесь вы найдете ос- новные сведения по инсталляции программного обеспечения, созданию и запуску клиента сети и некоторые полезные установки конфигурации. Эта часть завершается главой по самым основным операциям: соединение с базой данных примера и созда- ние вашей первой собственной базы данных с использованием утилиты isql, входя- щей в состав Firebird. В этой части вводятся различные инструменты командной строки для администратора и рассказывается, как запустить и остановить сервер. 2 Зак. 420
34 Введение Часть II содержит обзор концепций и моделей архитектуры клиент-сервер и описа- ние того, насколько им соответствует реализация Firebird. Финальная глава этой час- ти содержит некоторые общие практические инструкции по использованию клиент- ских библиотек Firebird. В части III вы найдете детальное описание каждого типа данных SQL, поддерживае- мого Firebird. Существует отдельная глава для каждого класса типа данных — числа, тип дата/время, символьные типы и т. д. — с множеством советов по их использо- ванию. Часть IV исследует объекты базы данных в подробностях, начиная с самой базы данных и переходя к таблицам, индексам и другим типам объектов. Синтаксис и ис- пользование операторов языка определения данных (Data Definition Language, DDL) представлены в этой части. Часть V содержит документацию по языку манипулирования данными (Data Manipu- lation Language, DML), используемому в SQL Firebird. Часть VI описывает транзакции: как они работают, как их конфигурировать, и со- держит советы по их использованию в ваших прикладных программах. Часть VII описывает программирование на стороне сервера в Firebird: написание триггеров и хранимых процедур, создание и использование событий базы данных, обработка ошибок в вашем коде на сервере. Часть VIII посвящена вопросам безопасности, архитектуры и конфигурации. Последняя часть IX документирует инструменты командной строки и их оболочки для администрирования. Приложения и глоссарий В приложениях и глоссарии представлены следующие материалы и детали. Приложение 1 содержит имена, описания и примеры внешних функций (UDF, User- defined functions, Определенные пользователем функции), поставляемых в библиоте- ках fb_udf и ib udf для платформ POSIX (Portable Operating System Interface for UNIX, Интерфейс переносимых операционных систем) и в свободно распространяе- мой Грегори Дитцем FreeUDFLib.dll для Windows. Приложение 2 является собранием советов по устранению ошибок; к нему вы можете обратиться, когда встречаются проблемы соединения удаленных клиентов с сервером Firebird. Приложение 3 суммирует информацию о некоторых основных драйверах и средствах программного интерфейса, доступных в Firebird. Содержит адреса сайтов загрузки и поддержки этих материалов. Приложение 4 описывает пошаговую процедуру, которой вы должны следовать, если обнаружили логические ошибки в базе данных Firebird. Приложение 5 описывает множество графических инструментов, доступных для ра- боты с вашими базами данных Firebird. Содержит ссылки на адреса загрузки инстру- ментов.
Введение 35 Приложение 6 содержит некоторые замечания о базе данных employee.fdb (employee.gdb в версии 1.0.x), которую инсталлятор Firebird устанавливает в подката- логе examples вашего корневого каталога Firebird. Приложение 7 перечисляет различные физические ограничения, применимые к базам данных Firebird 1.0.x и 1.5. Приложение 8 является полным справочником по интернациональным наборам сим- волов и связанным с языками порядкам сортировки, поставляемым с Firebird 1.5. Приложение 9 содержит спецификации описания данных для таблиц схемы, поддер- живаемых сервером Firebird внутри каждой базы данных. Включает листинги исход- ных кодов отдельных полезных просмотров, которые вы можете создавать для про- смотра системных таблиц. Приложение 10 содержит полный список в виде таблицы кодов исключений (SQLCODE и GDSCODE), определенных в Firebird 1.5, вместе с соответствующими символическими константами и текстами сообщений на английском языке. Приложение 11 содержит список всех ключевых слов, которые Firebird 1.0.x и 1.5 трактует как зарезервированные слова. Приложение 12 — собрание ресурсов, доступных пользователям Firebird. Содержит книги и другие документированные рекомендации и описания, а также ссылки на форумы поддержки. Глоссарий содержит детальные описания терминологии и концепций, которые вы, скорее всего, встретите при вашем путешествии по Firebird. Данные были получены из опросов опытных и не слишком опытных членов сообщества Firebird, которых попросили предоставить "список пожеланий" для глоссария. Происхождение Firebird Созданный как проект с открытыми исходными кодами, Firebird является первым в новом поколении потомков InterBase 6.0 Open Edition фирмы Borland, который был сформирован для разработки открытых исходных кодов в июле 2000 г. в рамках In- terBase Public License (IPL). Исходные коды Firebird поддерживаются и развиваются на основании международ- ного открытого кода на сайте SourceForge.net (http://sourceforge.net), большой груп- пой профессиональных разработчиков, в которую входят добровольцы и наемные специалисты, получающие частичное финансирование из сообщества и коммерче- ских источников. СОВЕТ. Продукты реляционной СУБД Firebird и некоторые связанные модули распространяются полностью свободными от регистрации или гонорара на осно- вании универсальной лицензии на открытые коды. Проект Firebird, его разработ- чики и его программное обеспечение никак не связаны с Borland Software Corpo- ration.
36 Введение Проект Firebird Разработка Разработчики, проектировщики и тестеры, кто предоставил вам Firebird и некоторые драйверы, являются членами проекта открытых кодов Firebird в SourceForge, изуми- тельного виртуального сообщества, которое является домом для тысяч групп про- граммного обеспечения с открытыми кодами. Адрес проекта Firebird: http://sourceforge.net/projects/firebird. На этом сайте находятся исходные коды CVS, сообщения об обнаруженных ошибках и множество технических файлов, которые могут быть загружены для различных целей, связанных с разработкой и тестировани- ем кода. Разработчики и тестеры проекта Firebird используют форум firebird-devel @lists.sourceforge.net в качестве своей "виртуальной лаборатории" для общения друг с другом по вопросам улучшения, исправления ошибок и создания новых версий Firebird. Любой, кто хочет наблюдать продвижение вперед и иметь обратную связь по вопро- сам разработки бета-версий, может присоединиться к этому форуму. Поддержка разработчиков приложений и администраторов базы данных Firebird имеет мощное сообщество добровольных помощников, включая большую группу активных разработчиков с многолетним опытом разработки и распростране- ния Firebird и его предшественника InterBase. Чувство солидарности в этой большой группе таково, что, приобретя умения и изучив "внутренние хитрости" по советам других людей, члены группы создают соответствующий список для обучения других пользователей. Основным каналом свободной поддержки является форум поддержки Firebird. Специализированные группы проекта поддерживают соответствующие форумы: Java, Delphi, C++ Builder, инструменты, Visual Basic, .NET, PHP и др. Группы пред- ставлены в виде списков e-mail, многие из них отображаются на сервере новостей. Самые свежие ссылки на эти форумы всегда могут быть найдены на главном Web- сайте сообщества (http://www.firebirdsql.org) и на дочернем коммерческом сайте IBPhoenix (http://www.ibphoenix.com). Сайт IBPhoenix также содержит огромный объем технической и пользовательской документации, ссылки на инструменты сторонних разработчиков и доску текущих новостей о событиях, произошедших в сообществе Firebird. В приложении 12 смотрите исчерпывающий список ресурсов поддержки сообщества. FirebirdSQL Foundation FirebirdSQL Foundation Inc. — это некоммерческий фонд, зарегистрированный в Но- вом Южном Уэльсе в Австралии, который собирает во всем мире денежные средства для предоставления разработчикам, работающим над основным и специальными
Введение 37 проектами для развития, тестирования и улучшения Firebird. Средства поступают в виде частной и корпоративной спонсорской помощи, пожертвований или членских взносов. Это предоставляет возможность благодарным пользователям Firebird воз- вращать вложения за свободное использование программного обеспечения и под- держку сообщества. (См. на http://www.firebirdsql.org/ff/foundation.) Спарки Спарки, молодой, алый феникс с зеленым клювом — талисман Firebird. Спарки крутился возле проекта Firebird в различных на- рядах с самого начала, однако он впервые появился "как персона" на Первой международной конференции по Firebird в г. Фулда в Германии, в мае 2003 года. Обзор возможностей Firebird является программным обеспечением для платформы клиент-сервер, разра- ботанным специально для использования в локальных и глобальных компьютерных сетях. Соответственно, его ядро состоит из двух основных программ: сервер базы данных, который выполняется на сетевом хост-компьютере, и клиентская библиоте- ка, через которую пользователи с удаленных рабочих станций соединяются и обща- ются с базой данных, управляемой сервером. /Д ВНИМАНИЕ! Администрирование и разработка в полноценной SQL реляционной / ! \ СУБД на платформе клиент-сервер, вероятно, являются совершенно новой для *—"“Д- вас территорией. Вам это может показаться слишком сложным, если вы впервые отважились обратиться к программному обеспечению управления данными, в котором заложена возможность существования множества параллельных про- цессов. Часть II этой книги содержит введение в концепцию клиент-сервер. Если вы почувствуете, что теряетесь в следующих описаниях, вы можете тут же обра- титься к части II, чтобы освоить контекст. Версии Firebird Двоичные файлы Firebird версии 1.0.x были разработаны для корректировки и улуч- шения написанных на языке С модулей, которые сообщество открытых исходных текстов наследовало от InterBase 6.0. Для Firebird 1.5 модули были полностью пере- писаны на C++ с высокой степенью стандартизации. Переход от версии 1 к версии 1.5 был в большей мере внутренним, интерфейс при- кладного программирования (Application Programming Interface, API) не изменился. Программное обеспечение приложений, написанное для версии 1, требует небольших (или вообще никаких) изменений для работы с версией 1.5. И хотя рекомендуется установить и использовать самую последнюю версию, несо- вместимость операционных систем означает (при всем уважении к Linux), что по-
38 Введение следняя версия 1.0.x— единственный выбор для некоторых сайтов. Многие новше- ства версии 1.5 были привнесены в версию 1.0.x, и регулярно выпускаются дополни- тельные сборки. Доступ к сети Сервер Firebird, запущенный на любой платформе, принимает ТСР/1Р-подключения клиентов с любой клиентской платформы, которая может выполнять Firebird API. Клиенты не могут подключиться к серверу Firebird через какую-нибудь файловую систему коллективного доступа (NFS, соединение клиентов Samba, общие ресурсы Windows или сетевой диск и т. д.). Клиент должен подключаться с указанием абсолютного физического пути. Тем не менее в Firebird 1.5 и выше средство алиасов баз данных позволяет приложениям выполнять "мягкое подключение" с использованием именованных алиасов, чьи абсо- лютные пути указаны специально для каждого сервера. К серверу Firebird, запущенному на хосте в Windows с сервисами, можно получить доступ от клиентов Windows с помощью сетевого протокола Named Pipes (именован- ные каналы). Многоверсионная архитектура Модель изоляции и управления работой множества пользователей, принятая в Fire- bird, является центральной частью архитектуры; она позволяет сохранять в базе дан- ных более одной версии записи одновременно. Множество версий одной записи мо- жет существовать одновременно — отсюда термин "многоверсионный". Каждая пользовательская задача имеет свой собственный контекстный вид состояния базы данных (см. следующий раздел) и записывает свои версии записей на диск сервера. В этот момент новая версия записи (или удаленная запись) недоступна другим зада- чам пользователей. Только самая последняя подтвержденная версия записи является видимой за преде- лами пользовательской задачи, которая успешно сохранила новую версию, и эта запись продолжает оставаться видимой для других задач. Другие задачи будут в кур- се того, что что-то произошло с этой записью, поскольку они будут блокированы от изменения или удаления этой записи, пока новая версия не станет "официальной" после подтверждения изменений. По причине использования многоверсионной архитектуры (называемой также MGA — Multi-generational architecture) для Firebird нет необходимости в двухфазной блокировке, используемой другими СУБД для управления многопользовательской работой. Транзакции Все задачи пользователей в Firebird помещаются внутрь транзакций. Задача начина- ется с оператора start transaction и завершается, когда выполненная работа под- тверждается (commit) или отменяется (rollback). Задача пользователя может выпол-
Введение 39 нять множество запросов к операциям в одной транзакции, включая операции с более чем одной базой данных. Работа сохраняется в базе данных в два этапа. На первом этапе изменения сохраня- ются на диске без изменения состояния базы данных. На втором этапе изменения подтверждаются или отменяются клиентским процессом. В версии 1.5 и выше клиен- ты могут отменить часть работы, маркируя этапы с помощью точек сохранения (savepoints) и отменяя изменения до точки сохранения без отмены всей транзакции. Транзакции в Firebird являются атомарными в том смысле, что вся работа в рамках транзакции будет сохранена или вся отменена. Транзакции можно конфигурировать с использованием трех уровней изоляции и множества стратегий тонкой настройки параллельности выполнения и условий чте- ния/записи. Хранимые процедуры и триггеры Firebird имеет богатый язык процедурных расширений, PSQL, для написания храни- мых процедур и триггеров. Это структурированный язык с поддержкой циклов for для множеств, условными переходами, обработкой ошибок и пересылкой событий. После создания код PSQL компилируется и сохраняется в двоичном виде. Триггеры имеют сильную поддержку с фазами До (Before) и После (After) каждого события манипулирования данными. Для каждой фазы/события может существовать множество триггеров, они могут содержать номера, задающие последовательность выполнения. Firebird 1.5 и выше поддерживает триггеры Before и After, которые об- рабатывают все три события манипулирования данными с условными переходами для каждого события. Ссылочная целостность Firebird имеет полную поддержку формальной, основанной на стандартах SQL, ссы- лочной целостности — иногда называемой декларативной ссылочной целост- ностью — включая необязательные каскадные изменения и удаления. Оперативное копирование базы данных Серверы Firebird могут при необходимости поддерживать создание оперативных ко- пий базы данных. Оперативная копия (shadow) является копией базы данных реаль- ного времени с некоторыми дополнительными атрибутами, которые делают ее не- доступной для чтения, пока она не будет сделана доступной сервером в качестве ба- зы данных. Оперативные копии могут переключаться либо вручную, либо автоматически. Назначение оперативного копирования — сделать базу данных дос- тупной в кратчайший срок при поломках диска. Оперативное копирование не является репликацией.
40 Введение Безопасность Безопасность сервера Firebird обеспечивает безопасность доступа пользователей к серверу с помощью идентификатора пользователя и зашифрованного пароля. Как и любой другой сервер базы данных, Firebird использует соответствующие средства защиты физического, сетевого доступа и файловой системы. Firebird может хранить зашифрованные дан- ные, но за исключением шифрования пароля он не предоставляет средств шифрова- ния самих данных. Д ВНИМАНИЕ! Поскольку встраиваемый сервер (см. разд. "Встраиваемый сер- вер") разработан для однопользовательских, автономных приложений, он совер- шенно не проверяет безопасность для хоста. Привилегии SQL, заданные на уровне базы данных, еще применяются, но приложение через встраиваемый сервер может получить доступ к любой базе данных на этом компьютере без указания пароля. (См. главу 34.) Привилегии SQL Хотя пользователь должен быть авторизован для доступа к серверу Firebird, но ника- кой пользователь, за исключением SYSDBA и владельца базы данных, не имеет ав- томатически никаких прав на индивидуальную базу данных. Безопасность на уровне базы данных поддерживается посредством привилегий SQL. Пользователям должны быть явно предоставлены привилегии к любому объекту. Роли SQL позволяют объединить несколько привилегий в группу и предоставить как "пакет" индивидуальным пользователям. Отдельный пользователь может иметь при- вилегии от нескольких ролей, хотя только одна роль может быть выбрана при соеди- нении с базой данных. Рабочие режимы Сервер Firebird может быть инсталлирован для выполнения в одном из трех рабочих режимов (operating modes): Суперсервер (Superserver), Классический сервер (Classic server) и Встраиваемый сервер (Embedded server). Различие между ними— скорее вопрос архитектуры. Любое клиентское приложение, написанное для соединения с Суперсервером, может соединяться точно тем же способом и с Классическим серве- ром и выполнять в точности те же задачи. Обратное также верно, за исключением того, что у Суперсервера более высокие требования к безопасности потоков для мо- дулей внешних функций (определенные пользователем функции, библиотеки набо- ров символов, BLOB-фильтры). Встраиваемый сервер является вариантом Суперсервера. Классический сервер Классический сервер предшествует Суперсерверу исторически. Он был разработан после 1980 года, когда ресурсы машин были скромными, и программы использовали
Введение 41 их весьма экономно. Модель Классического сервера являлась продолжением опера- ционных систем, чьи возможности по использованию потоков либо не существовали, либо были слишком ограничены для поддержания Суперсервера. Классический сер- вер остается лучшим вариантом для условий, где важна высокая производительность и использование системных ресурсов увеличивается линейно при добавлении каждо- го нового соединения. Поскольку Классический сервер может использовать множество центральных про- цессоров, он является весьма подходящим для сайтов, требующих выполнения мно- жества продолжающихся в реальном режиме времени приложений, использующих автоматически полученные коллекции данных, с минимальным или вовсе отсутст- вующим интерактивным вводом. С ПРИМЕЧАНИЕ. Классический сервер для Windows недоступен в версиях Firebird, предшествующих 1.5. Суперсервер В 1996 году в предшественнике Firebird, InterBase 4.1 появился многопоточный Су- персервер для новых тогда 32-битных платформ Windows. Он позволял лучше ис- пользовать новые возможности серверов и компьютерных сетей. Возможности Су- персервера исключить взаимоблокировку поточных процессов и динамически выде- лять кэш-память сделали его более удобным, чем Классический сервер, когда велико количество пользователей, выполняющих чтение/запись, а системные ресурсы огра- ничены. С бурным ростом операционных систем GNU/Linux на базе Intel к концу 1990-х го- дов Суперсервер стал хорошим решением для некоторых платформ POSIX. Основная структура Суперсервера для Linux была реализована в InterBase бета-версии 6.0 с открытыми исходными кодами и затем была полностью реализована в Firebird 1.0. Архитектура Суперсервера стала доступной для платформ Sun Solaris. Встраиваемый сервер Firebird 1.5 представил встроенный вариант Суперсервера для платформ Windows. В этой модели Суперсервер компилируется вместе с встроенным клиентом, который напрямую подключается к базе данных. Одна динамическая библиотека (fbembed.dll) использует межпроцессное коммуникационное пространство Windows для передачи клиентских запросов и ответов сервера. Его API идентичен API обычного Суперсер- вера или Классического сервера. В коде приложения не требуется ничего специаль- ного для использования встраиваемого сервера. Приложение, использующее встраиваемый сервер, может применять только локаль- ный метод доступа (см. главу 2) и поддерживает один и только один клиентский про- цесс. Вы можете использовать столько встроенных приложений на одной машине, сколько вам нужно, однако одна база данных может в каждый момент времени быть открыта только одним таким приложением. Приложение встраиваемого сервера мо-
42 Введение жет выполняться на той же машине одновременно с обычным сервером Firebird. Тем не менее с базой данных не может быть одновременно соединен обычный сервер и встраиваемый сервер. Встраиваемый сервер удовлетворяет самым низким требованиям масштабируемости сервера Firebird, давая возможность распространять одно высокопродуктивное при- ложение для одной базы данных с минимальными затратами. Поскольку к базе дан- ных может иметь доступ и обычный сервер, выполняющий репликацию при нерабо- тающем встроенном приложении, встраиваемый сервер особенно подходит для "компактных" установок — например, на ноутбук или даже на флэш-диск. Сравнение моделей Суперсервера и Классического сервера см. в главе 36. В той же главе в разд. "Работа со встроенным сервером” вы найдете полное описание работы со встроенным сервером под Windows. Пример базы данных Везде в этой книге языковые примеры используют пример базы данных, которая на- ходится в каталоге Examples в папке, где установлен Firebird. В дистрибутиве Fire- bird 1.0.x она называлась employee.gdb. В Firebird 1.5 это employee.fdb. Краткое описание примера базы данных содержится в приложении 6. Соглашения по документации Основной текст книги представлен этим шрифтом. Тексты, набранные данным шрифтом, являются кодом, скриптами или примерами командной строки. ПРИМЕЧАНИЕ. Фрагменты текста, выделенные как этот, — используются для того, чтобы привлечь ваше внимание к важным моментам, которые могут повли- ять на ваше решение по использованию обсуждаемой возможности Firebird. СОВЕТ. Фрагменты, выделенные как этот, содержат советы, блестящие идеи или рекомендации. ВНИМАНИЕ! Обратите особое внимание на такой фрагмент. Синтаксические шаблоны Некоторые фрагменты кода представляют синтаксические шаблоны (syntax patterns), то есть модели кода, которые демонстрируют обязательные и необязательные эле- менты синтаксиса операторов SQL или команд командной строки. Для синтаксиче-
Введение 43 ских шаблонов применяются определенные соглашения по используемым символам. Для иллюстрации этих соглашений возьмем из главы 20 пример, показывающий син- таксический шаблон для оператора SQL select: SELECT [FIRST (m) ] [SKIP (n) ] [[ALL] | DISTINCT] <список-столбцов> [, [имя столбца] | выражение I константа ] AS имя-алиаса] FROM <таблица-или-процедура-или-просмотр> [{[[INNER] [ [{LEFT | RIGHT | FULL] [OUTER]] JOIN}] <таблица -или-процедура -или-просмотр> ON <условия-соединения> [{JOIN..]] [WHERE <условия-поиска>] [GROUP BY <список-группируемых-столбцов>] [HAVING <условие~поиска>] [UNION <выражение-выбора> [ALL] ] [PLAN <выражение-плана>] [ORDER BY <список-столбцов>] [FOR UPDATE [OF столбец! [, столбец2. .]] [WITH LOCK]] Специальные символы Элементы (ключевые слова, параметры), которые обязательны во всех случаях, появ- ляются без каких-либо дополнительных пометок, они выделены таким шрифтом, как и весь код в книге. В предыдущем примере ключевые слова select и from являются обязательными для каждого оператора select. Некоторые символы, которые никогда не появляются в операторах SQL или в коман- дах командной строки, используются в синтаксических шаблонах для указания осо- бых правил по их использованию. Это символы [],{}, I, <строка> и ... (многоточие). Они используются в шаблонах следующим образом. Квадратные скобки [ ] указывают, что элемент(ы) в скобках являются необязатель- ными. Когда встречаются вложенные квадратные скобки, то вложенные или внешние элементы являются необязательными. Фигурные скобки { } указывают, что элементы внутри скобок являются обязатель- ными. Обычное использование фигурных скобок— это представление необязатель- ного элемента (заключенного в квадратные скобки), означающее: "Если необязатель- ный элемент используется, часть, заключенная в фигурные скобки, является обяза- тельной". В предыдущем примере, если используется необязательная явная фраза JOIN, [{[[INNER] | [{LEFT | RIGHT | FULL} [OUTER]] JOIN}] то внешняя пара фигурных скобок указывает, что ключевое слово join является обя- зательным. Внутренняя пара фигурных скобок означает, что если задано соединение outer, то оно должно быть определено как left, right или full с необязательным ис- пользованием ключевого слова outer.
44 Введение Символ вертикальной черты | используется для разделения взаимоисключающих элементов. В предыдущем примере left, right и full являются взаимоисключающи- ми, также внутреннее (inner) и внешнее (outer) соединения являются взаимоисклю- чающими. Параметры задаются строкой, которая заключается в угловые скобки < >. Например, [where <условмя-поиска>] указывает, что одно или более условий поиска требуется в качестве параметров для необязательного предложения where в синтаксисе оператора SELECT. В некоторых случаях <строка> может быть сокращением для более сложной конст- рукции, которая в последующих строках синтаксического шаблона будет раскры- ваться уровень за уровнем для получения полной детализации. Например, вы можете увидеть приблизительно следующее выражение: <условия-псмска> = <выражение~столбца> = <константа> | <выражение> Пара точек или многоточие ... могут быть использованы в некоторых синтаксиче- ских шаблонах для указания того, что текущий элемент является повторяемым. ПРИМЕЧАНИЕ. Ни один из этих символов не является допустимым ни в опера- торах SQL, ни в командах командной строки1. Достаточно вводных слов! Первые четыре главы предназначены для того, чтобы вы начали работать с Firebird — загрузка и инсталляция серверных и клиентских про- грамм, изменение некоторых основных установок сети, конфигурирование несколь- ких установок, если значения по умолчанию не совсем подходят для вашей среды. И, в заключение, в главе 4 начало работы с сервером и базой данных с использовани- ем основного клиентского инструмента. ' Квадратные скобки могут присутствовать в операторах DDL для задания размерности массивов. —Прим, перев.
ЧАСТЬ I Учебный лагерь Глава 1. Инсталляция Глава 2. Установка сети Глава 3. Конфигурирование Firebird Глава 4. Основные операции

ГЛАВА 1 Инсталляция В этой главе описывается, как получить инсталляционный комплект для платформы, а также версии сервера Firebird, которые вы хотите установить на вашу серверную машину. Полный вариант инсталлятора устанавливает и сервер и клиент на одну ма- шину. Удаленным клиентам не требуется сервер Firebird вовсе. Процедура инсталляции клиента Firebird несколько изменяется в зависимости от платформы (см. разд. "Ин- сталляция клиентов" в главе 7). Если вы в Firebird новичок, не пытайтесь устанавли- вать только клиента, пока не разберетесь, как все части инсталляции по умолчанию соответствуют друг другу. Системные требования Память на сервере (все платформы) Оценка памяти сервера включает множество факторов. ♦ Работа сервера Firebird. Сервер Firebird осуществляет эффективное использова- ние ресурсов сервера. Суперсервер (Superserver) после старта использует прибли- зительно 2 Мбайта памяти. Классический сервер (Classic server) в POSIX не ис- пользует памяти, пока не установлено клиентское соединение. В Windows не- большие сервисы прослушивают запросы на соединения. ♦ Клиентские соединения. Каждое соединение с Суперсервером добавляет прибли- зительно 115 Кбайт, больше или меньше, в соответствии со стилем и характери- стиками клиентских приложений, а также спроектированной схемой базы данных. Каждое соединение с Классическим сервером использует приблизительно 2 Мбайта (в зависимости от количества применяемых соединением таблиц, триг- геров, процедур и других объектов — может быть и до 30—40 Мбайт. Для баз данных среднего размера — от 4 до 15 Мбайт). ♦ Кэш базы данных. Значение по умолчанию может конфигурироваться — в стра- ницах базы данных. Суперсервер использует единый кэш (с размером по умолча- нию 2048 страниц) для всех соединений и автоматически увеличивает кэш при необходимости. Классический сервер создает индивидуальный кэш (по умолча- нию 75 страниц) на каждое соединение.
48 Часть I. Учебный лагерь На основании существующих оценок отводите 64 Мбайта RAM для сервера и 16 Мбайт для локального клиента. Чем больше клиентов вы добавляете, тем больше памяти будет использовано. Базы данных с большим размером страниц используют ресурсы из большего участка памяти, чем базы данных с меньшим размером страниц. Использование ресурсов для Классического сервера увеличивается линейно с каж- дым новым подключением клиента; для Суперсервера ресурсы разделяются между несколькими подключениями, и будут динамически увеличиваться при необходимо- сти. Firebird 1.5 будет использовать для сортировки, если она необходима, дополни- тельную RAM. Использование памяти более подробно обсуждается в главе 6. Инсталляционные диски Сервер Firebird — и любые базы данных, которые вы создаете или с которыми со- единяетесь, — должны находиться на жестком диске, который физически подключен к машине. Вы не можете разместить компоненты сервера или любой базы данных на назначенном диске, в разделяемой файловой системе или в сетевой файловой сис- теме. CD-ROM Вы не можете запускать сервер Firebird с CD-ROM. При этом вы можете соединяться с базой данных только для чтения, находящейся на устройстве CD-ROM, физически подключенным к серверу1. Дисковое пространство При оценке дискового пространства, необходимого для инсталляции, просмотрите размеры следующих исполняемых файлов. Дисковое пространство сверх указанного минимума требуется для файлов баз данных, оперативных копий (если используют- ся), файлов сортировки, протоколов и копий баз данных. ♦ Сервер. Минимальная инсталляция сервера требует дискового пространства в пределах от 9 до 12 Мбайт в зависимости от платформы и архитектуры. ♦ Клиентская библиотека. Требует 350 Кбайт (встроенная: 1.4—2 Мбайт). ♦ Инструменты командной строки. Требуют приблизительно 900 Кбайт. ♦ Утилиты администратора базы данных. Требуют 1—6 Мбайт в зависимости от выбранных утилит. См. список свободно распространяемых и коммерческих ути- лит в приложении 5. 1 Не думайте, что копирование файла базы данных на компакт-диск сделает базу данных базой только для чтения. База данных должна быть сделана только для чтения с использовани- ем утилит gbak или gfix до записи на компакт-диск. См. соответствующие главы по инстру- ментам в части IX.
Глава 1. Инсталляция 49 Минимальные требования к машине Минимальные требования зависят от того, как вы планируете использовать систему. Вы можете запустить сервер и разрабатывать схемы баз данных на персональном компьютере с минимальной конфигурацией— даже на "быстром" 486 или на Pentium II с 64 Мбайт RAM будет работать Firebird 1.0.x— но такая конфигурация не позволит использовать многие возможности при работе в сети. Для версии 1.5 и бо- лее поздних процессор 586 с 128 Мбайт RAM может рассматриваться как минимум. Windows более требовательна к CPU и оперативной памяти, чем Linux, в которой запускается сервер на консольном уровне. Версии операционной системы влияют на требования: некоторые платформы UNIX требуют больше ресурсов как для сервера, так и для клиента, а требования некоторых версий Windows неприменимы к указан- ным характеристикам, независимо от требований программного обеспечения. Поддержка SMP и HyperThreading Суперсервер и Классический сервер Firebird могут использовать разделяемую память мультипроцессоров в Linux. В Windows поддержка SMP (симметричный мультипро- цессор) доступна только для Классического сервера. Технология HyperThreading ненадежна, похоже, она зависит от нескольких условий, включая платформу операционной системы, поставщика оборудования и версию сер- вера. Некоторые пользователи сообщают об успешном использовании, другие имеют проблемы. Если у вас есть машина с такими возможностями, проверьте вначале вы- бранный вами сервер на эту возможность и будьте готовы отменить ее на уровне BIOS, если увидите замедление в работе. Характеристики процессора могут быть сконфигурированы на уровне сервера в firebird.config (версия 1.5) или в ibconfig/isc config (версия 1.0.x). В Window's для Су- персервера версий 1.0.x и 1.5 маска свойств CPU должна быть установлена в "единст- венный CPU" для SMP-машины. (См. разд. "Файл конфигурации Firebird" в главе 36.) Операционная система В табл. 1.1 показаны минимальные требования к операционной системе для выпол- нения серверов Firebird. При этом всегда смотрите файл README в каталоге /doc в вашем комплекте поставки для получения последней информации по операционной системе. Таблица 1.1. Минимальные требования Firebird к операционной системе Операционная система Версия Примечания Microsoft Windows NT 4.0 Требуется Service Pack 6а Windows 95/98/МЕ Возможно, нужны обновления: библиотеки времени выполнения Microsoft С (msvcrt.dll) версии 6 или вы- ше. Для Firebird 1.5 требуется библиотека C++ (msvcrt60.dll или выше). В Firebird 1.5 копии распола- гаются в каталоге \brrt каталога Firebird. Winsock 2 требуется для всех серверов; он может быть нужен для инсталляции под Windows 95
50 Часть I. Учебный лагерь Таблица 1.1 (окончание) Операционная система Версия Примечания Windows 2000 с Service Pack 2 Windows ХР Базы данных не должны иметь расширения gdb Server 2003 Базы данных должны располагаться в разделах, где возможность VSS (оперативное копирование тома) отключена Linux Red Hat Версия 7.1 или выше для Firebird 1.0.x, версия 8.0 или выше для Firebird 1.5. Для Red Hat 9 и выше обратитесь к замечаниям по инсталляции Linux в соответствии с реализацией NPTL SuSE Версия 7.2 или выше для Firebird 1.0.x, вер- сия 8.10 или выше для Firebird 1.5 Mandrake Версия 8.0 или выше для Firebird 1,0.x, версия 9.0 или выше для Firebird 1.5 Все платформы Linux Firebird 1.5 (сервер и клиент) требует glibc-2.2.5 или выше и libstdc++.so, связанную с libstdc++-5.0 или выше Другие ОС Solaris (Intel, SPARC), Mac OS X, FreeBSD, HP-UX 10+ Подробности смотрите в комплекте поставки Firebird Как получить инсталляционный комплект Комплект Firebird можно найти на главном сайте Firebird (http://www.firebirdsql.org) или на сайте SourceForge (http://firebird.sourceforge.net). Ссылки на этих страницах приведут вас к: http://sourceforge.net/project/showfiles.php?group_id=9028. Главная страница на сайте Firebird обычно содержит список ссылок на последние релизы для Linux и Windows. Другие ссылки будут указывать на дистрибутивы для других платформ. Если файл в своем имени содержит "src", то это созданный исход- ный код, а не инсталляционный пакет. Дистрибутивы, имеющие в своем имени "de- bug", "debuginfo" или "pdb", содержат специальные файлы для анализа и отладки сбоев сервера или клиента с помощью сред разработки и не требуются для обычной работы. Содержание комплекта Каждый инсталляционный комплект содержит все компоненты, нужные для инстал- ляции Firebird. ♦ Исполняемая программа сервера Firebird. ♦ Множество других программ, нужных при инсталляции и/или во время выполне- ния задач.
Глава 1. Инсталляция 51 ♦ Скрипты командной строки или командные файлы, нужные при инсталляции, которые также могут использоваться как утилиты сервера. ♦ Файл безопасности баз данных (isc4.gdb для версии 1.0.x; security.fdb для вер- сии 1.5). ♦ Одна или более версий клиентской библиотеки для установки на сервере и на клиентской рабочей станции. ♦ Инструменты командной строки. ♦ Стандартные библиотеки внешних функций и скрипты их описания (*.sql). ♦ Пример базы данных. ♦ Заголовочные файлы С (не нужны начинающим!). ♦ Текстовые файлы, содержащие самые последние замечания для использования в процессе инсталляции и конфигурирования. ♦ Заметки по релизу и различные файлы README (необходимы для прочтения). Соглашения по именованию в комплекте инсталляции Имена файлов комплекта поставки для разных платформ не являются одинаковыми. Увы, они даже не являются "последовательно неодинаковыми"; при создании дист- рибутива часто нужно приспосабливаться к специфическим для платформы соглаше- ниям или просто следовать их собственным правилам. Тем не менее некоторые эле- менты в именах файлов могут быть вам полезны для идентификации того комплекта, который вам нужен. Классический сервер или Суперсервер? Обычно первой частью имени является строка "Firebird". ♦ Если релиз для Windows поддерживает Классический сервер, он будет включен в тот же инсталлятор, что и Суперсервер. ♦ Для платформ POSIX, которые поддерживают обе архитектуры, отдельные ин- сталляторы поставляются для Классического сервера и Суперсервера. Имя уста- новочного пакета будет начинаться с "FirebirdCS" (для Классического сервера) или с "FirebirdSS" (для Суперсервера). ♦ Для меньших платформ архитектура может быть менее очевидной, и первая часть имени может быть названием ОС или аппаратной платформы. Номера версий Имена всех комплектов поставки должны содержать разделенную точками строку чисел в следующем порядке: номер версии, номер релиза, номер подрелиза. Напри- мер, "1.0.3"— это третий подрелиз от начального (код С) релиза Firebird версии 1, в то время как "1.5.0" — начальный подрелиз релиза 5 (код C++) версии 1. Большин-
52 Часть I. Учебный лагерь ство комплектов поставки также содержат абсолютный номер создания (например, 1.0.3.972 или 1.5.2.4731). Для некоторых малых платформ, особенно тех, которые имеют собственные правила именования и созданы различными компиляторами, но- мера версий могут быть менее очевидными. 64-битовый ввод/вывод Для платформ, которые требуют специальной компоновки для поддержки 64-бито- вого ввода/вывода, вам нужно посмотреть на инфикс "6410" где-нибудь в строке имени. Он не будет присутствовать в именах комплектов поставки для операционных систем, которые осуществляют автоматическую поддержку 64-битового ввода/вы- вода. Не пытайтесь инсталлировать комплект, отмеченный как "6410", на версии, где ОС, файловая система или аппаратура не поддерживают 64-битовый ввод/вывод2. Архитектура CPU Архитектура CPU обычно включается в имя строки инсталляционного комплекта. Например, инсталлятор RPM для UNIX обычно включает указание на набор микро- схем (например, i686). Список файлов отображает в списке загрузки обычно наибо- лее полезный указатель минимального набора микросхем, поддерживаемого инстал- ляционным пакетом. Комплект для Solaris предполагает наличие процессора Intel, если в имени комплекта поставки не присутствует "SPARC". Зеркальные сайты Когда вы найдете требуемый комплект поставки, щелкните мышью по гиперссыл- ке — имени файла. Вы перейдете на список зеркальных сайтов, как показано на рис. 1.1. Не имеет значения, какой зеркальный сайт вы выберете — комплект поставки иден- тичен для всех сайтов. Комплект поставки для Linux Прокручивайте отображаемый в SourceForge список файлов, пока не увидите файлы, показанные на рис. 1.2. Здесь представлены реальные исполняемые инсталляторы. Доступны инсталляторы RPM и инсталляторы сжатых файлов (TAR-файлы). Если ваш дистрибутив Linux поддерживает инсталляторы RPM, выберите именно его. Он создаст каталоги и уста- 2 Под 64-битовым вводом/выводом имеется в виду поддержка в сервере, операционной системе и файловой системе работы с файлами размером больше 4 Гбайт, что требует не ста- рой 32-битовой адресации, а 64-битовой. Это не имеет отношения к поддержке 64-разрядных процессоров. — Прим. науч. ред.
Глава 1. Инсталляция 53 Yuui download should begin shortly. If it does not, try httn: dieanHt.dl.souiceforue.net somcefonie firebird.FireliirdCS 1.5.0.1ZH1 (I,ibUG.ipm nr choose a different rnirrur You are using mirror: heanet.dl.sourceforge.net Host Location Continent Download i Dublin, Ireland Europe 2772 kb Minneapolis, MN 1 North America 2772 kb Reston , VA North America ВЙВМИВВИИвИйИИИИ Select Preferred Mirror . .T hea n et (1EB Рис. 1.1. Выбор зеркального сайта SourceForge Package 0 ... . Filename & Notes Size firebird [show only this package] firebird-linux-i386 [show only this package] в 1 11) Rilei i j D/L Arch. Type 2004-02-19 21:00 hrt,bjfch S 1 5 i 42 чг 0 ib°& rpm 2837886г в .гртв FirebirdCS-1.5.0.4290-0.i6S6.tar.gz FirPbfrdCs-dRhiHUnfn-i 5 И ‘Kt'QD- 2802184 □ 1386 0 i386 gz 0.i686.tar.gz uo±z406 .gz FirebirdSS-l 5 0.4290-01686 .ram : В3003269 . : В В . i: B B 0: i386:- BBB. .rpm FirebirdSS-l.5.0,4290-0 .i686.tar.gz 2990059 0 i386 .gz FirebirdSS-debuginfo-1.5.0.4290- O.i686.tar.gz 13512109 0 1386 .gz 1.0.3-Release [show only this release] 2003-06 02 22:00 FirebirdCS-1.0.3.972-0.6410.1.386.rpm 2649789 1329 i386 .rpm FirebirdCS-l.u. j ,y72-u.64io .tar.gz 2618305 5821386 .gz Fitebrri.CS 10 3 0 BBr rim 2c49105 3i68:i3863в .rpm FirebiraCb-1 ,U,3.9 /г-O .tar.qz 2618227 1406 ,386 ,gz FirebirciSS-l.0.3.972-0.6410.lOSo.rprn 2676186 1260 1386 .rpm FirebirdSS-l.0.3.972-0.6410.tar.gz 2660131 637 1386 .gz Fireb;rdSS-l .0.3.972-01386 rpm 2675525 53674386 .rpm FirebirdSS-l.0.3 972-0 tar qz 2659575 1879 1386 ,gz Рис. 1.2. Комплект поставки для Linux на SourceForge
54 Часть I. Учебный лагерь новит все необходимое, определит пароль для пользователя SYSDBA и запустит вы- бранный вами сервер. Инсталляторы имеют следующие имена: ♦ Firebird 1.5 — FirebirdCS-1.5.2.4731-0ii686.rpm (Классический) и FirebirdSS-1.5.2.4731-0.i686.rpm (Суперсервер); ♦ Firebird 1.03 — FirebirdCS-1.0.0.972-0.i386.rpm (Классический) и FirebirdSS-1.0.0.972-0.i386.rpm (Суперсервер). Посмотрите документацию соответствующей платформы по использованию Red Hat Package Manager (RPM). В большинстве дистрибутивов у вас есть возможность за- пускать инсталлятор RPM из командной строки или через графический интерфейс пользователя (GUI). Сжатые файлы (tarballs) В дистрибутивах Linux, которые не могут выполнять пакеты RPM, и во многих раз- новидностях UNIX используйте сжатые файлы (обычно .tar.gz или .bz2), т. к. они да- ют опытному пользователю Linux больший контроль над процессом инсталляции. Соответствующая утилита распаковки понадобится на вашем сервере для распаковки комплекта поставки в вашей файловой системе. Вы найдете детальные инструкции в официальных замечаниях по релизу, README-файлах и замечаниях к поставке. Знающие пользователи могут также просмотреть и настроить инсталляционные скрипты, чтобы сделать их работоспособными в менее общих версиях Linux. СОВЕТ. Скрипты поставляются для командной строки. В некоторых случаях в замечаниях к поставке могут быть инструкции, как изменять скрипты и выполнять некоторые ручные настройки. Скрипты описываются далее в этой главе. В любом случае прочтите все поставляемые текстовые файлы, а также соответст- вующие темы в официальных замечаниях по релизу, которые относятся к той версии Firebird, которую вы собираетесь инсталлировать. Могут существовать серьезные отличия между совместимыми с POSIX ОС дистрибутивами и релизами, особенно в случае открытых исходных текстов. Где только возможно, в комплекте поставки для каждой версии Firebird в замечаниях по релизу делается попытка документировать вопросы, связанные с различными версиями ядра и дистрибутивами. СОВЕТ. Если вы не нашли замечания по релизу в вашем комплекте поставки, обратитесь к главной странице сайта IBPhoenix (http://www.ibphoenix.com) и загрузите замечания по релизу оттуда. Реализация NPTL для высших версий Linux Новая библиотека потоков POSIX (Native POSIX Thread Library, NPTL) в Red Hat 9 (и, возможно, в более поздних дистрибутивах Linux) создает проблемы с Суперсер- вером и локально скомпилированными программами, а также с утилитами. Утилита
Глава 1. Инсталляция 55 gbak сообщает об ошибке "broken pipe". Для устранения этой ошибки выполните сле- дующие шаги: 1. Проверьте, что запущен сервер. В /etc/init.d/firebird выполните: LD~ASSUME_KERNEL=2.2.5 export LD_ASSUME_KERNEL 2. Вам нужно установить переменную окружения в соответствии с локальным ок- ружением, так что добавьте следующее в /etc/profile, чтобы быть уверенным, что каждый пользователь может ее использовать в утилитах командной строки. После HISTSIZE=1000 добавьте LD_ASSUME_KERNEL=2.2.5 С помощью следующей строки экспортируйте ее: export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUT_RC LD_ASSUME_KERNEL Комплект поставки для Windows Официальный комплект поставки для Windows (рис. 1.3) распространяется в виде исполняемых инсталляторов. Очень рекомендуется использовать инсталлятор в вари- антах ZIP или RAR. Package fc^otes Filename firebird [show only this package] Date Size D/L Arch. Type firebird-win32 # 1.5.0-Release 2004-02-19 21:00 Firebird-1.5.0.4290_debug_win32.zip 3098378 0 i386 .zip Firebird-1.5.0.4290_embed_win32.zip 1515889 0 i386 .zip Firebird-1,5.0.4290_win32.zip 3428584 0 i386 .zip Firebird-1 5,0 4306-Wih32:®e:3eg|fJ| ||Ш13949197<: 03386 .exe (32-bit Windows) # 1.0.3-Release 2003-06 02 22:00 Firebird-1.0.3.972-Win32 .exe 2986195 34952 i'386 .exe (32-bit Windows) Рис. 1.3. Комплект поставки Windows с сайта SourceForge Комплекты поставки Firebird включают исполняемые программы и связанные файлы для двух моделей сервера: Суперсервер и Классический сервер. В диалогах инсталля- тора вас будут спрашивать, какую модель вы хотите устанавливать, какие компонен- ты не должны копироваться на диск. Единственная поддерживаемая модель для Fire- bird 1,0.x — это Суперсервер.
56 Часть I. Учебный лагерь Имена релизов инсталляторов следующие: ♦ Firebird 1.5 — Firebird-1.5.2.473 l_Win32.exe; ♦ Firebird 1.03 — Firebird-1.0.3.972-Win32.exe. Сжатые файлы Если комплект поставки для Windows содержит ZIP-файлы, вам нужно иметь утили- ты (например, WinZip, PKZip или WinRAR) для просмотра содержимого и/или рас- паковки файлов перед инсталляцией. Такой комплект поставки (не для начинающих) содержит следующее: ♦ версия 1.5 ZIP полной поставки клиент-сервер Firebird-1.5.2.4731_ win32.zip. Мо- жет быть распакован в стандартный каталог без инсталляции в системе. Некото- рые программы инсталляции должны запускаться после распаковки. Инструкции включены в различные текстовые файлы в подкаталоге /doc; ♦ отдельный комплект поставки встраиваемого сервера версии 1.5 для Windows. Имя файла релиза комплекта поставки — Firebird-1.5.2.473 l embed_win32.zip. ПРИМЕЧАНИЕ. Не существует встраиваемого сервера для версии 1.0.x. Серверы На платформах, имеющих сервисы — Windows NT, 2000 и ХР — сервер Firebird ин- сталлируется по умолчанию для запуска как сервис. Сервис инсталлируется и запус- кается автоматически по окончании процедуры инсталляции, а также при первона- чальной загрузке серверной машины. Как остановить и запустить сервер вручную см. главу 4. Младшие из платформ Windows — Windows 95, 98 и ME — не поддерживают серви- сы. После инсталляции сервер Firebird будет запускаться как приложение, защищен- ное программой Guardian. Если приложение сервера будет по разным причинам ава- рийно завершено, Guardian постарается заново запустить его. Для сервера, запущен- ного как сервис, рекомендуется также использовать Guardian. Не пытайтесь инсталлировать Классический сервер, если у вас уже установлен Су- персервер, или наоборот. Клиентские библиотеки Копии клиентских библиотек устанавливаются: ♦ для Firebird 1.0.x имя клиентской библиотеки gds32.dll; она устанавливается в системный каталог C:\WINNT\system32 для Windows, имеющей сервисы, и в C:\Windows для других версий Windows; ♦ для Firebird 1.5 и последующих версий имя клиентской библиотеки fbclient.dll; по умолчанию она устанавливается в каталог /bin корневого каталога Firebird. По умолчанию утилиты загружают ее именно оттуда, а не из системного каталога.
Глава 1. Инсталляция 57 ПРИМЕЧАНИЕ. Для обычных клиентских приложений, включающих множество компонентов базы данных и инструменты администратора, размещение и имено- вание клиентской библиотеки не являются столь строгими. См. в главе 7 альтер- нативные варианты инсталляции клиентской библиотеки — на сервере и на кли- ентских рабочих станциях — для совместимости со многими графическими инст- рументами и другими существующими приложениями. Тестирование результатов инсталляции Если все работает, как описано, сервер Firebird будет запущен на вашем сервере по окончании процесса инсталляции. Вы можете запустить некоторые тесты для про- верки инсталляции и выполнить нужные настройки вашей конфигурации. Сетевой протокол Предполагается, что вы будете использовать рекомендованный протокол TCP/IP для вашей сети клиент-сервер, чтобы получить все преимущества независимой от плат- формы сети. СОВЕТ. Чтобы получить информацию об использовании протокола NetBEUI (Named Pipes, Именованные каналы) во всех версиях Windows, см. разд. "Сете- вые протоколы" в главе 2. ВНИМАНИЕ! Firebird не поддерживает IPX/SPX и не работает на Novel Netware 3 и 4. Тестирование сервера Обычно первое, что вы захотите сделать после завершения инсталляции, — это про- верить обращение к серверу. Это даст вам реальную возможность убедиться, что ва- ша клиентская машина может видеть хост в вашей сети. Предположим, что IP-адрес вашего сервера в домене, видимый вашему клиенту, 192.13.14.1. Перейдите в ко- мандную строку и введите следующую команду: ping 192.13.14.1 Замените в этом примере IP-адрес на реальный IP-адрес вашего сервера. СОВЕТ. Если вы получили сообщение об истечении времени ожидания, обрати- тесь к главе 2 и приложению 2 для дальнейших инструкций. Если вам нужна бо- лее подробная информация об установках серверных IP-адресов, см. разд. "Се- тевой адрес для сервера" в главе 2. Если вы соединяетесь с сервером с локального клиента — т. е. клиент запущен на той же машине, что и сервер, — вы можете обратиться к виртуальной заглушке TCP/IP:
58 Часть I. Учебный лагерь ping localhost ИЛИ ping 127.0.0.1 Проверка, что сервер Firebird запущен Классический сервер POSIX Используйте команду рз в командной строке для просмотра запущенных процессов. Если какие-нибудь клиенты соединены с классическим процессом Firebird, вы долж- ны увидеть один процесс с именем fbjnet server (или gds_inet_server для Firebird 1.0.x) для каждого соединенного клиента. Команда ps имеет несколько пере- ключателей, однако следующий вариант дает подходящий список. Команда grep фильтрует вывод так, что вы будете видеть только процессы Firebird. [ххх]$ ps -aux | grep fb На рис. 1.4 запущены три клиентских процесса. USER PID «CPU #MEM VS2 RSS TTY STAT START TIME COHMAKD root 1046 0.0 0.7 6920 3552 ? S 00:07 0:00 fb_inet_sei:ver root 1052 0.1 0.6 6608 2916 ? S 00:10 0:00 fb_inet_server root 1056 1.0 0.7 6920 3548 ? S 00:12 0:00 Eb_inet_server Рис. 1.4. Список классических процессов, полученный с помощью ps Суперсервер POSIX Поскольку Суперсервер разветвляется на потоки для каждого соединения, будет ин- тересным задать переключатель -f [ork] среди других переключателей для отображе- ния его процессов и потоков. Вы получите форматированное отображение разветв- ленных процессов, похожее на представленное на рис. 1.5: [ххх]$ ps -auxf | grep fb USER PID #CPU 0ИЕМ vsz RSS TTY STAT START TIME COHMAKD root 1215 0.0 0.2 3608 1348 ? s 18:43 0:00 /opt/firebird/bin/fbguard -f root 1216 0.0 1.0 65664 5068 ? s 18:43 0:00 /opt/firebird/bin/fbserver root 1217 0.0 1.0 65664 5068 ? 5 18:43 0:00 /opt/firebird/bin/fbserver root 1220 0.0 1.0 65664 5068 ? S 18:43. 0:00 /opt/firebird/bin/fbserver root 1978 0.0 1.0 65664 5068 ? s 18:48 0:00 /opt/firebird/bin/fbserver root 1979 0.0 1.0 65664 5068 ? s 18:46 0:00 /opt/firebird/bin/fbserver root 1980 0.0 1.0 65664 5068 ? s 18:48 0:00 /opt/firebird/bin/fbserver root 1981 0.0 1.0 65664 5068 ? 5 18:48 0:00 /opt/firebird/bin/fbserver Рис. 1.5. Список процессов и потоков Суперсервера, полученный с помощью рз Та же команда рз должна отображать один процесс с именем fbguard (или ibguard), если сервер был запущен с переключателем -fforever], и один главный процесс с
Глава 1. Инсталляция 59 именем fbserver (или ibserver). Должен быть, по меньшей мере, один дочерний поток с именем fbserver (или ibserver), разделенный на несколько потоков. Эта первая груп- па является "выполняющимся сервером" без клиентских соединений, за исключением тех, которые использует сервер для прослушивания портов и сборки мусора. Далее будет группа потоков для каждого соединения. ПРИМЕЧАНИЕ. Префикс "fb" относится к Firebird 1.5, a "gdb" и "ib"— к Fire- bird 1.0.x. Используйте ps -aux | grep gds, если у вас запущена версия 1.0.x. Windows NT 4,2000 и ХР Для серверных платформ Windows запустите апплет Firebird Server Control с Панели управления (Control Panel). Апплет Server Control На рис. 1.6 показан апплет Firebird Server Control, запущенный под Windows 2000 Server. Если вы использовали инсталлятор, этот апплет будет установлен на вашу Панель управления. Его внешний вид может изменяться в зависимости от варианта сервера Windows. Рис. 1.6. Апплет Firebird Server Control Вы можете использовать этот апплет для запуска и остановки сервиса и для модифи- кации режимов запуска и выполнения. Не рекомендуется изменять режим на Run as an application (Выполнять как приложение) для многопользовательского использо- вания в целях безопасности — вы должны оставлять подключение к серверу, чтобы сервер Firebird оставался запущенным.
60 Часть I. Учебный лагерь Апплет Service Если у вас нет апплета Control Panel, вы можете использовать апплет Services (рис. 1.7) в Инструментах администрирования. В Windows NT 4 вы можете получить доступ к этому апплету напрямую через Панель управления. Action View » " > -и ,0 (В d? ; ч vJsJjalJ Tree J Name Description Status i Startup Type I Log On As *• i Services (Local; ^gjEvent Log ^Fax Service Firebird Guardian - DeFaultinstance Firebird Server - Defaultinstance ^Jlndexing Service ^Internet Connection Sharing ^IPSEC Policy Agent Logical Disk Manager nnira! Disk Mananer Administrah... Logs event... Helps you ... Provides n... Manages I,,. Logical Disk.,. Arlroinistrat.. Started Started Started Started Started Automatic Manual Automatic Manual Manual Manual Automatic Automatic Manual LocalSystem •• Localsystem ~ J LocalSystem LocalSystem LocalSystem LocalSystem I LocalSystem LocalSystem <) 1 nralSvsfem. Mil ' " ' - - - - Рис. 1.7. Апплет Services на серверных платформах Windows На рис. 1.7 показаны имена сервисов Firebird 1.5— для Guardian и сервера. Имена сервисов могут отличаться в зависимости от версий, Guardian может вовсе не появ- ляться в списке. Пользователь с привилегиями администратора может, щелкнув пра- вой кнопкой мыши по имени сервиса, остановить или запустить сервис. Если вы ис- пользуете Guardian, остановите этот сервис, чтобы остановить и Guardian, и сервер. В Windows 2000 и Windows Server 2003 Guardian скорее удобен, чем необходим, по- скольку эти две операционные системы имеют средства просмотра и повторного за- пуска сервисов. Рекомендуется оставлять Guardian активным на других платформах, если пользователь SYSDBA недоступен для рестарта сервера вручную в случаях, когда он был остановлен по различным причинам. Другие апплеты Панели управления Если вам нужен апплет Firebird Manager и вы не нашли его инсталлированным на Панели управления вашего сервера Windows, или если вам нужен апплет с языком, отличным от английского, загрузите его с сайта Firebird: http://www.ibphoenix.com. Закройте окно Панели управления и скопируйте файл CPL непосредственно в ваш системный каталог Windows. Windows 9х, ME и ХР Home Edition Windows 9х, ME и ХР Ноте Edition не поддерживают сервисы. Сервер Firebird дол- жен быть запущен как приложение, контролируемое программой Guardian. Если вы используете инсталляционный комплект, который устанавливает, но не запускает автоматически Guardian и сервер Firebird, вы можете сделать это вручную, как пока- зано далее.
Глава 1. Инсталляция 61 1. Найдите исполняемый файл программы Guardian (ibguard.exe) и создайте для него ярлык в области запуска меню кнопки Пуск. 2. Откройте диалоговое окно Свойства для этого ярлыка и перейдите к полю, где располагается командная строка. 3. Отредактируйте командную строку так, чтобы она выглядела следующим об- разом: fbguard.exe -а 4. Сохраните и закройте диалог Свойства. 5. Сделайте двойной щелчок по ярлыку для запуска Guardian. Guardian запустит fbserver.exe. Теперь Guardian должен запускаться автоматически, когда вы будете выполнять пер- воначальную загрузку вашей машины. Апплет Server Control Некоторые версии апплета Server Control могут быть установлены на платформе Windows, не поддерживающей сервисы. Если инсталлятор устанавливает его на ва- шей машине, то он может быть использован так же, как было описано для версий, поддерживающих сервисы. Невозможно только выбрать вариант Run as a service (Запускать как сервис), даже если он отображается на экране. В Windows версии Ноте, чтобы исключить путаницу, апплеты бывают скрытыми или отображаются недоступными (серым цветом). Инсталляция встраиваемого сервера Д ВНИМАНИЕ! Если вы раньше не использовали Firebird, то очень рекомендуется пропустить этот вариант, пока вы не приобретете опыт работы с сервером Firebird и "регулярными" клиентами. Вы ничего не потеряете, разрабатывая ваши первые приложения в обычной модели клиент-сервер; они будут работать так же хорошо и с встраиваемым сервером. Объединение сервера и клиента осуществляется через динамическую библиотеку fbembeded.dll, которую вы найдете в каталоге /bin после обычной инсталляции Firebird. Вы можете инсталлировать встраиваемый сервер, если вы уже инсталлиро- вали сервер или другие встраиваемые серверы. Для каждого приложения встраиваемого сервера каталог исполняемого файла вашего приложения становится корневым каталогом этого приложения встраиваемого серве- ра. Для выполнения встроенной инсталляции с вашим приложением сделайте сле- дующее: ♦ скопируйте fbembeded.dll в каталог приложения и переименуйте в fbclient.dll или в gds32.dll в соответствии с тем, какое имя клиентского файла требуется вашей программе связи с базой данных; ♦ скопируйте файлы firebird.msg, firebird.conf и aliases.conf в тот же каталог;
62 Часть I. Учебный лагерь ♦ если вы собираетесь использовать алиасы базы данных (рекомендуется), то ско- пируйте aliases.conf в каталог приложения (домашний каталог, home directory) и сконфигурируйте его для этого конкретного приложения; ♦ если внешние библиотеки требуются для вашего приложения, такие как поддерж- ка интернациональных языков (fbintl.dll), библиотеки UDF или библиотеки Blob- фильтров, создайте для них соответствующие каталоги (../inti, ../UDF) непосред- ственно внутри каталога вашего приложения и скопируйте туда эти файлы. Пример структуры встроенной инсталляции Приведем пример структуры каталогов и содержание файлов конфигурации для ин- сталлированного приложения встраиваемого сервера: D:\my_app\MyApp.ехе D:\my_app\gds32.dll D:\my_app\fb\firebird.conf D:\my_app\fb\aliases.conf D:\my_app\fb\firebird.msg D:\my_app\fb\intl\fbintl.dll D:\my_app\fb\UDF\fbudf.dll Файл firebird.conf: RootDirectory = D:\my_app\fb Файл aliases.conf: MyApplication = D:\databases\MyDB.fdb Другие вещи, которые вам нужно знать Пользователи Имя пользователя и пароль по умолчанию Пользователь SYSDBA имеет все привилегии доступа к серверу. Программа инстал- ляции создаст пользователя SYSDBA в базе данных безопасности (security.fdb). Для версий под Windows и версии 1.0.x под Linux пароль masterkey. СОВЕТ. Фактически пароль — masterke, т. к. все символы после восьмого игно- рируются. В версии 1.5 и более поздних под Linux инсталлятор в процессе установки генериру- ет случайный пароль, помещает его в базу данных безопасности и сохраняет в тек- стовом файле SYSDBA.password. Запомните этот пароль или используйте для досту- па к базе данных безопасности, чтобы изменить его на что-нибудь более простое для запоминания.
Глава 1. Инсталляция 63 ВНИМАНИЕ! Если ваш сервер совсем не защищен в Интернете, вы должны из- менить этот пароль немедленно. Как изменить пароль пользователя SYSDBA Если вы работаете в Linux или другой системе, которая может выполнять SH- скрипты, измените текущий каталог на ../bin в вашем каталоге инсталляции и найди- те скрипт с именем changeDBAPassword.sh. Все, что вам нужно сделать, — это запус- тить скрипт и ответить на подсказки. Когда вы в первый раз запустите скрипт, вам будет нужно ввести пароль, который инсталлятор записал в файл SYSDBA.password; он находится в корневом каталоге Firebird: [bin]# sh changeDBAPassword.sh ИЛИ [bin]# ./changeDBAPassword.sh Прямое использование gsec Следующая процедура будет работать под Windows и Linux. В Linux, чтобы запус- тить gsec, вы должны войти в операционную систему как суперпользователь (root). Пусть вы решили изменить у SYSDBA пароль с masterkey на icuryy4me (в Firebird 1.5 для Linux инсталлированный пароль не masterkey, он может оказаться совсем невра- зумительным!). Вам нужно выполнить следующие шаги: 1. Перейдите в окно командной строки на вашем сервере и сделайте текущим ката- лог, в котором находятся ваши утилиты командной строки. Обратитесь к табл. 1.2—1.5, чтобы определить их положение. 2. Для Windows наберите следующее, рассматривая символы, как чувствительные к регистру: gsec -user sysdba -password masterkey Для платформ POS1X наберите: ./gsec -user sysdba -password masterkey Теперь вы должны увидеть подсказку утилиты gsec: GSEC> 3. Наберите команду: GSEC> modify sysdba -pw icuryy4me 4. Нажмите клавишу <Enter>. Новый пароль icuryy4me будет зашифрован и сохра- нен, a masterkey не будет больше действовать. 5. Теперь завершите программу gsec: GSEC> quit Поскольку Firebird игнорирует все символы в пароле после восьмого, icuryy4m будет работать так же, как и icuryy4monkey.
64 Часть I. Учебный лагерь СОВЕТ. Полные инструкции по использованию gsec находятся в главе 34. Пользователи и группы в Linux/UNIX Начиная с Firebird 1.5, пользователь root больше не является пользователем по умол- чанию, который может запускать сервер. Это означает, что вам нужно поместить пользователей, не являющихся root, в группу firebird, чтобы предоставить им воз- можность доступа к базам данных. Чтобы добавить пользователя (например, sparky) в группу firebird, пользователю root нужно ввести: $ usermod -G firebird sparky Теперь sparky может соединиться с базой данных Firebird и начать работу с ней. Для отображения списка групп, в которых присутствует пользователь, наберите в командной строке: $ groups СОВЕТ. Пользователю группы firebird могут также понадобиться привилегии чте- ния и записи ко всем базам данных и привилегии чтения, записи и выполнения ко всем каталогам, где размещаются базы данных. Инструмент администратора Инсталляционный комплект Firebird не содержит инструментов администратора с графическим интерфейсом. У него есть набор инструментов командной строки (ис- полняемые программы), которые расположены в каталоге /bin каталога инсталляции Firebird. Их использование подробно описано в части IX. Отличные инструменты графического интерфейса, доступные для использования на клиентских машинах Windows, слишком многочисленны, чтобы их здесь описать. Небольшое количество графических инструментов написано на Borland Kylix для использования на клиентских машинах под Linux, они находятся на разных стадиях завершения. Список наиболее известных инструментов администратора для Firebird представлен в приложении 5. Для получения самого последнего списка зайдите на http://www.ibphoenix.com, выберите ссылку Contributed из области загрузки и на- жмите на ссылку Administration Tools. СОВЕТ. Вы можете использовать клиентские инструменты администратора в Windows для доступа к серверу Linux и наоборот.
Глава 1. Инсталляция 65 Размещение на диске по умолчанию Таблицы в этом разделе описывают размещение компонентов для Windows и Linux на диске по умолчанию. Информация дается в контексте двух версий: ♦ версии, предшествующие Firebird 1.5; ♦ версии Firebird 1.5 и последующие. Разница является существенной. Версии, предшествующие Firebird 1.5, используют размещение, имена компонентов и ссылки на ресурсы, как и InterBase 6.x и более ранние версии InterBase. Следовательно, не существует возможности запускать и сервер Firebird, и сервер InterBase этих версий на одной и той же машине. В пересмотре основного кода, который начался с версии 1.5, старые ссылки на по- стороннюю информацию InterBase были удалены, а многие из главных компонентов были переименованы. Firebird 1.5 дает возможность запускать также и сервер Inter- Base. Это верно и для Firebird 2. Табл. 1.2—1.5 показывают, где искать компоненты при стандартной инсталляции после выполнения инсталлятора. Точное расположение может изменяться от релиза к релизу. Таблица 1.2. Инсталляция Firebird 1.5 для Linux и некоторых платформ UNIX Компонент Имя файла Размещение по умолчанию Классический сервер fb_inet_server /opt/firebird/bin Программа Lock Manager (только Классический сервер) fb_lock_mgr /opt/firebird/bin Встроенный клиент для Классического сервера libfbembed.so. 1.5.0 /opt/lib Firebird Guardian (только Суперсервер) fbguard /opt/firebird/bin Суперсервер fbserver.exe /opt/firebird/bin Поточный клиент для Суперсервера и Классического сервера libfbclient.so /usr/lib Файл конфигурации firebird.conf /opt/fi rebird Файл алиасов базы данных aliases.conf /opt/firebird Файл сообщений firebird.msg /opt/firebird Файл сгенерированного пароля SYSDBA.password /opt/firebird База данных безопасности security.fdb /opt/firebird Копия базы данных безопасности security.fbk /opt/firebird Инструменты командной строки isql, gbak, gfix, gstat, gsec, gdef, gpre, qli /opt/firebird/bin Инструмент сервера (только Суперсервер) fbmgr /opt/firebird/bin 3 Зак. 420
66 Часть I. Учебный лагерь Таблица 1.2 (окончание) Компонент Имя файла Размещение по умолчанию Скрипты командной строки Различные; обрати- тесь к файлам README и заметкам по релизу /opt/firebird/bin Скрипт шаблона для Firebird (только Классический сервер) firebird.xinetd /opt/firebird/misc Библиотеки внешних функций (библиотеки UDF) ib_udf.so, fbudf.so /opt/firebird/UDF Библиотека утилиты памяти (используется в ib_udf) libib_util.so /opt/firebird/lib Скрипты DDL для библиотек внешних функций ib_udf.sql, fbudf.sql /opt/firebird/UDF Библиотека поддержки интернацио- нальных языков fbintl /opt/firebird/int! Заметки по релизу Firebird_v15.nnn_ ReleaseNotes.pdf /opt/firebird Другая документация Файлы README no различным темам /opt/firebird/doc Пример базы данных employee.fdb /opt/firebird/sample Заголовочные файлы С ibase.h, iberror.h и др. opt/firebird/include Таблица 1.3. Инсталляция Firebird 1.5 для 32-битовых платформ Windows Компонент Имя файла Размещение по умолчанию Классический сервер fb_inet_server.exe C:\Program Files\Firebird\ Firebird_1_5\bin Программа Lock Manager (только Классический сервер) fb_lock_mgr.exe C:\Program Files\Firebird\ Firebird_1_5\bin Firebird Guardian (только Суперсервер) fbguard.exe C:\Program Files\Firebird\ Firebird_1_5\bin Суперсервер fbserver.exe C:\Program Files\Firebird\ Firebird_1_5\bin Встроенный Суперсервер fbembed.dll C:\Program Files\Firebird\ Firebird_1_5\bin (инсталлировать в каталог приложе- ния и переименовать в fbciient.dll)
Гпава 1. Инсталляция 67 Таблица 1.3 (окончание) Компонент Имя файла Размещение по умолчанию Клиентская библиотека для Суперсервера и Классическо- го сервера gds32.dll (заглушка) и fbclient.dll C:\Program Files\Firebird\ Firebird_1_5\bin Файл конфигурации firebird.conf C:\Program Files\Firebird\ Firebird_1_5\bin Файл алиасов базы данных aliases.conf C:\Program Files\Firebird\ Firebird_1_5\bin Файл сообщений firebird, msg C:\Program Files\Firebird\ Firebird_1_5\bin База данных безопасности security.fdb C:\Program Files\Firebird\ Firebird_1_5\bin Копия базы данных безопас- ности security.fbk C:\Program Files\Firebird\ Firebird_1_5\bin Инструменты командной строки isql, gbak, gfix, gstat, gsec, gdef, gpre, qli, fb_lock_print C:\Program Files\Firebird\ Firebird_1_5\bin Сервисы и регистрационные инструменты instsvc.exe, instreg.exe C:\Program Files\Firebird\ Firebird_1_5\bin Библиотеки внешних функ- ций (библиотеки UDF) ib_udf.dll, fbudf.dll C:\Program Files\Firebird\ Firebird_1_5\UDF Библиотека утилиты памяти (используется в ib_udf.dll) ib_util.dll C:\Program Files\Firebird\ Firebird_1_5\bin Скрипты DDL для библиотек внешних функций ib_udf.sql, fbudf.sql C:\Program Files\Firebird\ Firebird_1_5\UDF Библиотека поддержки ин- тернациональных языков fbintl.dll C:\Program Files\Firebird\ Firebird_1_5\intl Заметки по релизу Firebird_v15.nnn_ ReleaseNotes.pdf C:\Program Files\Firebird\ Firebird_1_6 Другая документация Файлы README no различным темам C:\Program Files\Firebird\ Firebird_1_5\doc Пример базы данных employee.fdb C:\Program Files\Firebird\ Firebird_1_6\sample Заголовочные файлы С ibase.h, iberror.h и др. C AProgram Files\Firebird\ Firebird_1_5\include
68 Часть I. Учебный лагерь Таблица 1.4. Инсталляция Firebird 1.0.3 для Linux и некоторых платформ UNIX Компонент Имя файла Размещение по умолчанию Классический сервер gds_inet_server /opt/interbase/bin Программа Lock Manager (только Классический сервер) ib_lock_mgr /opt/interbase/bin Встроенный клиент для Классического сервера gdslib.so /usr/lib Суперсервер ibserver.exe /opt/interbase/bin Поточный клиент для Суперсервера и Классического сервера gdslib.so /usr/lib Файл конфигурации isc_config /opt/interbase Файл сообщений interbase.msg /opt/interbase База данных безопасности isc4.gdb /opt/interbase Копия базы данных безопасности isc4.gbk /opt/interbase Инструменты командной строки isql, gbak, gfix, gstat, gsec, gdef, gpre, qli /opt/interbase/bin Инструмент сервера (только Суперсервер) fbmgr /opt/interbase/bin Скрипты командной строки Различные; обрати- тесь к файлам README и замеча- ниям по релизу /opt/interbase/bin или /opt/interbase/sample Скрипт шаблона для Firebird (только Классический сервер) firebird.xinetd /opt/interbase/bin или /opt/interbase/sample Библиотеки внешних функций (библиотеки UDF) ib_udf.so, fbudf.so /opt/interbase/udf Библиотека утилиты памяти (ис- пользуется в ib_udf) -TSROr libib_util.so~TSR ib_util /opt/interbase/lib/udf ~TSR/opt/ interbase Скрипты DDL для библиотек внешних функций ib_udf.sql /opt/interbase/udf Библиотека поддержки интернацио- нальных языков inti или intl.so /opt/interbase/intl Пример базы данных employee.fdb /opt/interbase/sample Заголовочные файлы С ibase.h, iberror.h и др. /opt/interbase/include
Глава 1. Инсталляция 69 Таблица 1.5. Инсталляция Firebird 1.0.3 для 32-битовых платформ Windows Компонент Имя файла Размещение по умолчанию Firebird Guardian ibguard.exe CAProgram Files\Firebird\bin Суперсервер ibserver.exe C:\Program Files\Firebird\bin Клиентская библиотека gds32.dll C:\WINNT\system32 (платформа с сервисами) или C:\Windows (другие) Файл конфигурации ibconfig CAProgram Files\Firebird Файл сообщений interbase.msg CAProgram Files\Firebird База данных безопасности isc4.gdb C:\Program Files\Firebird Копия базы данных безопасности isc4.gbk C:\Program Files\Firebird Инструменты командной строки isql, gbak, gfix, gstat, gsec, gdef, gpre. qli, iblockpr C:\Program Files\Firebird\bin Сервисы и регистрационные инструменты instsvc.exe, instreg.exe CAProgram Files\Firebird\bin Библиотеки внешних функ- ций (библиотеки UDF) ib_udf.dll, fbudf.dll CAProgram Files\Firebird\UDF Библиотека утилиты памяти (используется в ib_udf.dll) ib_util.dll C:\Program Files\Firebird\bin Скрипты DDL для библиотек внешних функций ib_udf.sql, fbudf.sql CAProgram Files\Firebird\UDF Библиотека поддержки интернациональных языков gdsintl.dll CAProgram Files\Firebird\intl Документация Файлы README no различным темам CAProgram Files\Firebird Пример базы данных employee.gdb CAProgram Files\Firebird\sample Заголовочные файлы С ibase.h, iberror.h и др. CAProgram Files\Firebird\include Пора дальше Firebird состоит из программы сервера и клиентских приложений; между сервером и каждым клиентом располагается сетевой протокол. Если вы использовали соответст- вующий инсталлятор для вашей платформы и использовали значения по умолчанию, вероятно, вам больше ничего не потребуется делать, и можно сразу приступать к на- чалу работы. Вы можете пропустить две следующие главы и перейти к "основам", описанным в главе 4. Если вас интересуют сетевые протоколы или вам кажется, что у вас есть проблемы, связанные с сетевыми протоколами, прочтите следующую гла- ву, и, возможно, просмотрите некоторые советы по конфигурированию в главе 3.
ГЛАВА 2 Установка сети Поскольку реляционная система управления базами данных (РСУБД) специально создана для платформы клиент-сервер, Firebird позволяет удаленным и локальным клиентам одновременно соединяться с сервером, используя различные сетевые про- токолы. Инсталлятор создаст конфигурацию по умолчанию для соединения клиента с серве- ром и для получения соединений от клиентов с использованием установок порта по умолчанию. Если только не существует внешних причин создавать пользовательскую конфигурацию сети, то нет необходимости для запуска Firebird изменять конфигура- цию, которая была установлена при инсталляции. Сетевые протоколы Firebird поддерживает протокол TCP/IP для всех комбинаций клиентских и сервер- ных платформ. Именованные каналы Firebird поддерживает протокол Microsoft WNet Named Pipes для серверов Windows NT/2000, XP и клиентов Windows. Имя канала по умолчанию interbas. Windows 9х и ME не могут быть серверами WNet. Jg ПРИМЕЧАНИЕ. Протокол Windows Named Pipes (именованные каналы) часто F'/л называют NetBEUI. Строго говоря, NetBEUI является транспортной частью, ис- пользуемой в WNet. Локальный доступ Хотя Firebird разработан, чтобы быть сервером базы данных для удаленных клиен- тов, он предоставляет множество средств локального доступа.
Глава 2. Установка сети 71 Клиент-сервер Средства локального доступа. ♦ Локальная заглушка TCP/IP. Для многоуровневых серверных приложений и дру- гих клиентов доступ к локальному серверу на любой поддерживаемой платформе осуществляется через протокол TCP/IP: даже при отсутствии сетевой карты со- единение может быть выполнено через специальный сервер localhost с IP-адресом 127.0.0.1. ВНИМАНИЕ! Соединение с localhost невозможно для приложений встраиваемо- го сервера. ♦ Режим локального соединения Windows. Для клиентов Windows, использующих Суперсервер Firebird на той же самой физической машине, Firebird поддерживает режим локального соединения, используя межпроцессную передачу данных для моделирования сетевого соединения без интерфейса физической сети и сетевого протокола. Это полезно при доступе к базе данных в процессе разработки, для приложений встраиваемого сервера и для консольных инструментов клиента, но в этом варианте не поддерживается механизм событий Firebird и параллельная ра- бота клиентской части из разных потоков приложения. Средства локального соединения клиент-сервер являются ограниченными и не должны использоваться при поставках программ. Распространяйте автономные приложения клиент-сервер, Web-приложения и другие уровни серверов с исполь- зованием для соединения локально закольцованного протокола TCP/IP. ♦ Прямое локальное соединение в POSIX. Может ли локальный клиент соединяться с базой данных в Linux и в некоторых других системах POSIX, зависит, в первую очередь, от варианта сервера, который вы инсталлировали (Классический сервер или Суперсервер), и, во вторую очередь, от типа клиентского соединения. Суперсервер совсем не принимает локальных соединений через обычный клиент- ский API. Путь для соединения всегда должен включать имя хоста TCP/IP. Тем не менее он принимает локальные соединения от "встроенных приложений" (прило- жений, написанных с использованием встроенного SQL — Embedded SQL, ESQL). Инструменты командной строки, gsec, gfix, gbak и gstat, которые являются встроенными приложениями, могут выполнять локальные соединения с Супер- сервером. Если у вас запущен Классический сервер, с локального клиента возможно прямое соединение. Встраиваемый сервер Начиная с Firebird 1.5, пакеты Firebird для Windows включают полную функциональ- ность встраиваемого сервера (клиент и сервер соединяются как динамическая биб- лиотека). Это идентично обычной модели клиент-сервер, за исключением того, что
72 Часть I. Учебный лагерь здесь не поддерживается сетевой протокол: соединение осуществляется в стиле "ло- кальной Windows" для эмуляции сетевого соединения. ВНИМАНИЕ! Встраиваемый сервер не поддерживает пароль безопасности дос- тупа Firebird. Смешанные платформы Архитектура Firebird позволяет клиентам, запущенным в одной операционной систе- ме, получить доступ к серверу Firebird, выполняющемуся на платформе и в операци- онной системе, отличных от клиентских. Часто используемый вариант— одновре- менный запуск нескольких недорогих персональных компьютеров с Windows 98 в качестве клиентских рабочих станций, имеющих доступ к главному серверу, выпол- няющемуся под Windows NT/2000/XP, Linux или под некоторой версией UNIX. База данных, которая была создана для использования на одной модели сервера, мо- жет работать на любом из них. Например, когда приложение встраиваемого сервера неактивно, его база данных может находиться под управлением другого приложения встраиваемого сервера или полного сервера Firebird, обслуживающего удаленных клиентов. Та же база данных может быть без изменений перенесена с одной плат- формы на другую'. К тому же платформы Windows и Linux, реализации сервера Firebird (Классический, Суперсервер или оба) работают также в Mac OS X (Darwin), FreeBSD, Sun Solaris (Intel и SPARC), HP-UX, потенциально в AIX и могут быть созданы для множества дополнительных платформ UNIX. Firebird в настоящее время не поддерживает ни платформу Novell NetWare, ни другие виды сетей, которые используют устаревший протокол IPX/SPX. С прекращением со стороны Novell поддержки этого протокола сайты часто используют серверы Firebird в системе Linux с сетевыми клиентами, подключенными к этой подсистеме через TCP/IP. Сетевой адрес для сервера Для связи через TCP/IP вы должны соединяться с хостом, который имеет известный адрес IP. Определение того, какой это адрес IP (или каким должен быть, если он от- сутствует), зависит от вида сетевого оборудования вашей хост-машины. 1 Заметьте, однако, что пользовательские библиотеки внешних функций не являются пере- носимыми между платформами. Необходимо создавать версии этих библиотек для каждой платформы, на которой может располагаться база данных. Все платформы, поддерживающие Windows, могут использовать те же библиотеки Windows; библиотеки разделяемых объектов для платформ POSIX не обязательно будут выполняться на всех платформах POSIX.
Глава 2. Установка сети 73 ♦ Если вы находитесь в управляемой сети, получите IP-адрес сервера у вашего сис- темного администратора. ♦ Если у вас простая сеть из двух машин, соединенных кабелем с перекрестными проводниками, или малая переключаемая сеть, вы можете установить для вашего сервера любой подходящий уникальный адрес IP, какой вам нравится, за исклю- чением 127.0.0.1 (который резервируется для локальной заглушки TCP). ♦ Если вам известны "родные" адреса IP ваших сетевых карт, и они различны, вы можете просто использовать их. ♦ Если вы собираетесь пробовать инсталляцию на одной машине и для клиента, и для сервера, вы должны использовать адрес локально закольцованного сервера — localhost или его IP-адрес 127.0.0.1. Д ВНИМАНИЕ! В Windows один пользователь может локально соединиться с сер- вером без использования локального TCP/IP как внешний или как встроенный клиент. Серверный адрес не требуется для такого соединения и не может быть использован для проверки того, правильно ли работает TCP/IP при вашей ин- сталляции. Файл HOSTS Если в вашей TCP/IP-сети не запущен сервис имен доменов, то необходимо проин- формировать индивидуально каждый узел о распределении адресов IP в именах хоста вашей сети. Для этого измените файл HOSTS для каждого узла (сервер и клиент). При установке узлов Firebird вашей TCP/IP-сети рекомендуется конфигурировать файлы имен хоста на клиентах и использовать имена, а не напрямую адреса IP при подключении к серверу. Хотя большинство последних операционных систем могут использовать IP-адрес хоста в строке соединения вашего клиента вместо имени хос- та, соединение через имя хоста гарантирует, что адрес сервера остается статичным, несмотря на динамическое изменение адресов в сети. Д ВНИМАНИЕ! Для рабочих станций, работающих под Windows 95 и ранней вер- сии Windows 98, где клиентские станции работают в старой 32-битовой версии Windows, сетевая поддержка вовсе не распознает IP-адрес в строке соединения, потому что эти версии инсталлировались с Winsock 1. В любом случае инсталля- ция Winsock 2 более соответствует требованиям текущих версий Firebird. Сво- бодно распространяемые пакеты обновлений могут быть загружены с сайтов поддержки пользователей Microsoft. Местонахождение файла HOSTS Перечислим, где можно найти файл HOSTS. ♦ В Linux и многих версиях UNIX файл HOSTS обычно расположен в /etc/. Помни- те, что имена файлов являются чувствительными к регистру на платформах се- мейства UNIX.
74 Часть I. Учебный лагерь ♦ В Windows NT/2000 файл HOSTS располагается в C:\WINNT\system32\drivers\etc\. ♦ В Windows 95/98/ME/XP/Server2003 файл HOSTS располагается в C:\Windows. СОВЕТ. Если файл HOSTS отсутствует, вы найдете файл с именем Hosts.SAM в том же месте. Скопируйте этот файл и переименуйте в HOSTS. Примеры записей файла: 10.12.13.2 db_server # Firebird-сервер (в LAN) 65.215.221.149 apress.com # (сервер в WAN) 127.0.0.1 localhost # локальная заглушка (в Windows) 127.0.0.1 localhost.localdomain # локальная заглушка(в Linux) Откройте и отредактируйте файл HOSTS в текстовом редакторе. Создание записей простое. Тем не менее обеспечьте, чтобы: ♦ IP-адрес, если это не 127.0.0.1 (localhost), был действительным, сконфигурирован- ным для хоста в вашей сети; ♦ имя сервера было любым уникальным именем в вашей сети; СОВЕТ. Серверная машина под Windows, которая была установлена в Windows Networking (Named Pipes) с именем хоста //Server_name, будет распространять это имя как имя хоста TCP/IP. ♦ комментарии после символа # необязательны, но рекомендуются; ♦ формат записей одинаков, независимо от того, под какой системой запущен хост — Windows или Linux/UNIX. А ВНИМАНИЕ! После того как вы отредактировали файл HOSTS, проверьте, что ваш редактор сохранил HOSTS без расширения имени файла. Если необходимо, удалите любое расширение, переименовав файл. Имя сервера и путь к нему При создании или перемещении базы данных убедитесь, что она располагается на жестком диске, который физически соединен с вашей серверной машиной. Файлы базы данных, расположенные на разделенных, назначенных дисках или (для UNIX) смонтированных как файловая система SMB (Samba), невидимы для сервера. Начиная с Firebird 1.5, у вас есть возможность сохранять пути к базам данных на ва- шем сервере с использованием anuacoe путей к базе данных. Это не только упрощает дело с установкой изменяемой строки соединения в ваших приложениях, но также добавляет дополнительный уровень безопасности для ваших удаленных соединений. Алиасы путей к базам данных не дают возможности чужим программам определить,
Глава 2. Установка сети 75 где расположены ваши базы данных, и использовать эту информацию для разруше- ния ваших файлов. Об алиасах базы данных см. главу 4. Синтаксис строки соединения Это строки соединения, очевидные для каждой платформы, которые нужны вам для конфигурирования алиасов и для соединения клиентов с базой данных, через сервер Firebird тех версий, которые не поддерживают алиасов базы данных. TCP/IP Строка соединения TCP/IP содержит два элемента: имя сервера и абсолютный путь диска/файловой системы, такой, как его видит сервер. Формат следующий: ♦ для соединения с сервером Linux: имя-сервера: / путь-файловой-системы/ файл-базы-данных Вот пример для Linux или другой операционной системы семейства UNIX для сервера с именем hotchicken: hotchicken:/opt/firebirdl5/examples/LeisureStore.fdb Д ВНИМАНИЕ! Помните, что для этих платформ все имена файлов являются чув- ствительными к регистру. ♦ для соединения с сервером Windows: имя-сервера-.Диск: \путь-файловой-системы\файл-базы-данных Пример: hotchicken:C:\Program Files\Firebirdl5\examples\LeisureStore.fdb Прямая наклонная черта также допустима в Windows: hotchicken:С:/Program Files/Firebirdl5/examples/LeisureStore.fdb Локальное соединение в Windows Соединение встроенного клиента или локального внешнего клиента в локальном ре- жиме Windows: C:\Program Files\Firebirdl5\examples\LeisureStore.fdb Сеть Windows (Named Pipes/WNet) Соединение удаленного клиента сервера Windows с использованием протокола Named Pipes: \\имя-серверах Диск: \путь\файл-базы-данных
76 Часть I. Учебный лагерь где \\имя-сервера — правильный идентификатор имени узла серверной машины в сети Windows, не может быть разделяемым или назначенным диском. Например, \\hotchicken\c:\databases\LeisureStore.fdb Несовместимые строки соединения для подключений Windows Суперсервер для Windows устанавливает исключающую блокировку на файл базы данных, когда активируется первое клиентское подключение, чтобы защитить базы данных от старой ошибки. Ошибка в пути соединения Windows воспринимает две формы абсолютного локального пути к файлу — один (правильный в соответствии со стандартом DOS), имеющий вид устройство:\путь- к-базе-данных, И другой: Устройство-.путь-к-базе-да иных (отсутствует обратная НаКЛОН- ная черта после обозначения дискового устройства). Если сервер получил два клиентских запроса на соединение, первое, использующее стандартную форму пути, и второе, с использованием второй формы, он будет трак- товать эти два соединения, как если бы они были соединениями с двумя разными базами данных. Результатом параллельных операций DML в подобном случае будет разрушение базы данных. Для соединений с Суперсервером исключающая блокировка решает проблему требо- вания для всех соединений применения того же формата пути, что был использован при первом соединении. То же решение не может применяться в случае Классическо- го сервера, потому что каждое соединение работает с собственным экземпляром сер- вера. Позаботьтесь о том, чтобы ваше приложение всегда передавало согласованные строки пути. СОВЕТ. Настоятельно рекомендуется использовать алиасы базы данных (см. разд. "Алиасы базы данных" в главе 4) для всех соединений. Убедитесь также, что файл aliases.conf содержит один и только один алиас для каждой базы дан- ных. Конфигурирование сервиса порта TCP/IP По умолчанию Firebird прослушивает порт 3050 при запросе соединения от клиентов TCP/IP. Зарегистрированное имя сервиса этого порта gds_db. Хорошая новость — вы можете использовать эти установки по умолчанию и ничего не делать с конфигура- цией сервиса порта ни для сервера, ни для клиента. Вы можете использовать другой порт, другое имя сервиса порта или и то, и другое. Вам может понадобиться это сделать, если порт 3050 требуется для другого сервиса, например, если параллельно используемый gds_db сконфигурирован для другой вер-
Глава 2. Установка сети 77 сии Firebird или для сервера InterBase. Есть несколько способов перекрыть значения по умолчанию. Сервер и клиенты оба должны быть сконфигурированы для измене- ния имени сервиса или номера порта (или и того, и другого) по меньшей мере одним из следующих способов: ♦ в строке соединения клиента; ♦ в команде запуска исполняемой программы сервера; ♦ активацией параметров RemoteServicePort ИЛИ RemoteServiceName В firebird.Config (версия 1.5 и выше); ♦ в демоне конфигурации (для Классического сервера в POSIX); ♦ в записи файла services. Прежде чем проверять каждую из этих техник, будет полезным взглянуть на логику, используемую сервером для установки прослушиваемого порта, и порядок установки клиентом используемого порта. Как сервер устанавливает прослушиваемый порт Исполняемая программа сервера имеет необязательный переключатель в командной строке (-р), который можно использовать для указания номера порта или имени сер- виса порта, который будет прослушиваться сервером. Если присутствует этот пере- ключатель, то номер порта 3050 или имя сервиса порта (gds_db) будут заменены на значение аргумента, указанного в переключателе -р. Затем— или вначале, если не установлен переключатель -р,— сервер версии 1.5 проверяет наличие параметров RemoteServicePort И RemoteServiceName В firebird.COnflg. ♦ Если оба параметра закомментированы с использованием #, то принимаются зна- чения по умолчанию, и никакие дальнейшие изменения не выполняются. Любой аргумент -р игнорируется, и "отсутствующие" аргументы сохраняют значение по умолчанию. ♦ Если RemoteServiceName (но не RemoteServicePort) не закомментирован, то имя сер- виса порта заменяется, только если это имя не было уже перекрыто переключате- лем -р. ♦ Если RemoteServicePort И RemoteServiceName не закомментированы, ТО RemoteServiceName получает приоритет, если он не был перекрыт аргументом -р. Если же ИМЯ сервиса порта уже было изменено, ТО значение RemoteServiceName бу- дет проигнорировано, и новое значение RemoteServicePort заменит предыдущее значение 3050. ♦ В этой точке, если замена номера порта или имени сервиса была выполнена, то оба сервера версий 1.0 и 1.5 выполняют проверку файла services на наличие запи- си с корректной комбинацией имени сервиса и номера порта. Если соответствие найдено, то все в порядке. Если нет, и имя сервиса порта не gds db, то сервер вы- даст исключение и отменит запуск. Если имя сервиса порта gds db и ему не мо- жет быть назначен никакой другой порт, он будет использовать порт 3050 автома- тически.
78 Часть I. Учебный лагерь Если значение по умолчанию для номера порта или имени сервиса было изменено, то вам может понадобиться создать запись в файле services. Для понимания того, нужно ли это делать, выполните шаги, описанные далее в этой главе в разд. "Конфигуриро- вание файла services". Использование переключателя -р Запуск сервера с необязательным переключателем -р дает вам возможность перекры- вать значение по умолчанию для номера порта (3050) или имя сервиса порта (gds db), которые используются сервером для прослушивания запросов на соедине- ние. Переключатель может перекрывать одно значение, но не оба. В Firebird 1.5 и следующих вы можете использовать переключатель -р в комбинации с конфигураци- ей в файле firebird.conf для получения возможности перекрывать и номер порта, и имя сервиса порта. Синтаксис для TCP/IP Шаблон синтаксиса для команд: Команда-сервера <другие переключатели> -р номер-порта | имя-сервиса Например, для запуска Суперсервера как приложения и замены имени сервиса с gds_db на fb_db введите: fbserver -а -р fb_db Для замены порта 3050 на 3051 введите: fbserver -а -р 3051 Синтаксис для Wnet Для сети Wnet замените аргумент переключателя -р на обратная черта-обратная черта—точка—@: fbserver -а -р \\.@fb_db ИЛИ fbserver -а -р \\.@3051 Классический сервер в POSIX: демон inetd или xinetd В Классическом сервере Firebird для Linux или UNIX демон inetd или xinetd сконфи- гурирован на прослушивание порта по умолчанию и имя сервиса по умолчанию. Ин- сталляционный скрипт запишет соответствующую запись в файл конфигурации /etc/inetd.conf или /etc/xinetd.conf. Проблемы с подключением к Классическому серверу часто происходят по причине отсутствия или неправильной записи сервиса порта в этом файле. Вы можете прове- рить текущую запись, открыв файл в текстовом редакторе (например, vim) и скоррек- тировав ее при необходимости. Следующий пример показывает, что вы должны уви- деть в файде /etc/inetd.conf или /etc/xinetd.conf после инсталляции Классического сер- вера Firebird в Linux:
Глава 2. Установка сети 79 # default: on # description: FirebirdSQL server # service gds_db ( flags = REUSE KEEPALIVE socket_type = stream wait = no user = root if user = @FBRunUser@ log_on_success += USERID log_on_failure += USERid server = /opt/firebird/bin/fb_inet_server disable = no ) Если вы изменили сервис порта на значение, отличное от значения по умолчанию, вы должны соответственно изменить /etc/inetd.conf или /etc/xinetd.conf. Заново стартуйте xinetd (или inetd) с аргументом kill -hup, чтобы убедиться, что демон будет исполь- зовать новую конфигурацию. Д ВНИМАНИЕ! Запросы на соединения будут неуспешными, если xinetd (или inetd) и fbserver (или ibserver) оба пытаются прослушивать один и тот же порт. Если ваша хост-машина имеет подобную дублирующую конфигурацию, то необходимо сделать такие установки, при которых каждая версия сервера имела бы свой собственный порт. Использование параметров файла конфигурации В Firebird 1.5 И выше вы можете конфигурировать ИЛИ RemoteServiceName, ИЛИ RemoteServicePort в файле firebird.config для изменения номера порта по умолчанию (3050), или имени сервиса порта по умолчанию (gds_db), которые использует сервер для прослушивания запросов на соединение. Сервер будет использовать один параметр Remoteservice*, но не оба. Если вы сконфи- гурировали оба, ТО ОН будет игнорировать RemoteServicePort ВО всех Ситуациях, за исключением того случая, когда команда запуска сервера была вызвана с переключа- телем -р, перекрывающим имя сервиса порта. Следовательно, вы можете использо- вать в комбинации переключатель -р и параметр Remoteservice* для изменения номе- ра порта и имени сервиса. Если значения по умолчанию для номера порта или имени сервиса были изменены, то вам нужно создать запись в файле services. Д ВНИМАНИЕ! Если ВЫ не закомментировали НИ RemoteServiceName, НИ RemoteServicePort, но оставили значения по умолчанию нетронутыми, они будут трактоваться как измененные. Необходимо создать запись в файле services для установок значений по умолчанию сервиса порта.
80 Часть /, Учебный лагерь Установка клиента для поиска порта сервиса Если вы установили ваш сервер с инсталляционными значениями по умолчанию (сервис gds db прослушивает порт 3050), то конфигурирование не требуется. Если сервер прослушивает другой порт или используется другое имя сервиса порта, то приложение клиента и/или хост-машины требуют некоторых изменений конфигура- ции, чтобы помочь клиентской библиотеке Firebird найти прослушиваемый порт. Строка соединения, используемая клиентом, может включать информацию для опро- са прослушиваемого порта сервера разными путями. Клиенты Firebird 1.5 могут ис- пользовать локальную копию firebird.conf. Изменения также могут понадобиться и для файла services. Использование строки соединения Если были изменены только номер порта или имя сервера, включите альтернативный номер порта или имя сервера в строку соединения. Это работает для всех версий Firebird. Синтаксис соединения TCP/IP Для соединения с сервером базы данных, названным hotchicken, связанным с портом 3050 и сервисом fb db, строка соединения в POS1X должна быть следующей: hotchicken/fb_db:/data/leisurestore.fdb Если же сервер имеет имя gds db, а номер порта 3051, то строка соединения должна быть следующей: hotchicken/3051:/data/leisurestore.fdb В Windows строка соединения должна быть: hotchicken/3051:D:\data/leisurestore.fdb hotchicken/fb_db:D:/data/leisurestore.fdb Обратите внимание, что разделитель между именем сервера и портом наклонная чер- та, а не двоеточие. Двоеточие требуется в строке физического пути после имени диска. Синтаксис соединений Wnet В сети Wnet используйте стиль нотаций UNC: //hotchicken@3051/d:/leisurestore.fdb или //hotchicken@fb_db/d:\leisurestore.fdb Если номер порта или имя сервиса были изменены, то вам нужно создать запись в файле services.
Гпава 2. Установка сети 81 Использование синтаксиса порта для алиасов базы данных Для соединения через порт, не являющегося портом по умолчанию, с помощью алиа- са базы данных добавьте номер порта или имя сервиса к имени сервера, а не к алиасу. Предположим,'что алиас базы данных был сохранен в aliases.conf в виде: hotstuff = /data/leisurestore.fdb Строка соединения вашего приложения с сервером hotchicken будет следующей: hotchicken/fb_db:hotstuff или hotchicken/3051:hotstuff Использование копии firebird.conf В Firebird 1.5 и выше вы можете скопировать на клиентскую сторону в корневой ка- талог Firebird файл firebird.conf И сконфигурировать RemoteServiceName ИЛИ RemoteServicePort для помощи клиенту в поиске серверного порта. Вы можете конфигурировать один из этих двух параметров; изменение значения дру- гого параметра можно выполнить через строку соединения (см. ранее). Вы можете перекрыть значение ТОЛЬКО RemoteServiceName ИЛИ RemoteServicePort без использова- ния строки соединения. Если вам не нужно передавать имя сервиса порта или номер порта в строке соедине- ния, а сервер не использует значения по умолчанию для обоих параметров, вы може- те конфигурировать оба RemoteServiceName И RemoteServicePort. Вы МОЖете ИСПОЛЬЗО- вать эту технику, если вашему клиентскому приложению нужно сохранить возмож- ность соединяться с серверами InterBase или Firebird 1.0. Размещение данных Firebird на клиентах Если вы используете на клиентских машинах файл firebird.conf, нужно, чтобы кли- ентская библиотека знала, где его найти. Вам необходимо создать корневой каталог Firebird и проинформировать систему о его местонахождении. Используйте для этого переменную среды firebird таким же образом, как и для серверов (см. главу 3). Кли- енты Windows могут также использовать запись в реестре. При правильной установке клиента вы можете также сделать доступной локальную версию файла сообщений. Более подробную информацию см. в разд. "Инсталляция клиентов" в главе 7. Конфигурирование файла services Вам не нужно изменять запись сервиса порта для сервера или клиентов Firebird, если сервер использует значения по умолчанию, заданные при инсталляции — gds db для порта 3050. Если gds db — имя сервиса порта, который не может использовать лю- бой другой порт, то он будет применять порт 3050 автоматически. Если вы изменили номер порта или имя сервиса, вы должны сделать явные измене- ния для сервера и клиентов, чтобы отобразить эти изменения. В Linux и Windows данная информация хранится в файле services.
82 Часть I. Учебный лагерь Местонахождение файла services Местонахождение файла services на разных платформах: ♦ в Windows NT/2000/XP этот файл находится в C:\winnt\system32\drivers \etc\services; ♦ в Windows 95/98/МЕ файл находится в C:\Windows\services; ♦ в Linux/UNIX файл находится в /etc/services. Записи файла services выглядят следующим образом: gds_db 3050/tcp # Firebird Server 1.5 Откройте файл в текстовом редакторе и добавьте новую строку или измените суще- ствующую запись gds db. ♦ Для сервера или клиента Firebird 1.0.x измените имя сервиса или номер порта для согласования с параметрами запуска сервера. ♦ Для сервера Firebird 1.5 или выше отредактируйте или добавьте нужную строку. Если у вас инсталлирован сервер Firebird 1.0 или InterBase на том же хосте, со- храните нужные для них записи и добавьте новую запись для согласования с па- раметрами запуска сервера. ПРИМЕЧАНИЕ. Если данная строка является последней в файле services, то рекомендуется в конце файла добавить пустую строку. Проверка соединения с помощью ping Вы сделали все нужные изменения. Последняя проверка нужна, чтобы убедиться, что ваша клиентская машина может связываться с сервером. Вы можете быстро прове- рить, что ваш клиент TCP/IP связывается с сервером, используя в окне командной строки команду ping: ping имя-сервера// подставьте имя, которое вы записали в файле HOSTS Если соединение прошло хорошо, и все правильно сконфигурировано, вы увидите приблизительно следующее: Pinging hotchicken [10.10.0.2] with 32 bytes of data reply from 10.10.0.2: bytes=32 time<10ms TTL=128 reply from 10.10.0.2: bytes=32 time<10ms TTL=128 reply from 10.10.0.2: bytes=32 time<10ms TTL=128 reply from 10.10.0.2: bytes=32 time<10ms TTL=128 Нажмите комбинацию клавиш <Ctrl>+<C> для прекращения сообщений ping.
Гпава 2. Установка сети 83 Если ping выдает ошибку Если вы получили нечто вроде Bad IP address hotchicken (Неверный IP-адрес hotchicken) то имя хоста в записи файла для имя-сервера (в этом примере hotchicken) может быть отсутствует или неверно написано. К примеру, все идентификаторы в Linux/UNIX являются чувствительными к регистру. Другая причина может заключаться в том, что имя хоста вашего сервера просто не было сконфигурировано. Если вы увидите: Request timed out то это означает, что адрес IP, на который ссылается имя хоста в вашем файле, не мо- жет быть найден в подсети. Проверьте следующее: ♦ нет ошибок в имени хоста в записи файла; ♦ сетевой кабель подключен, провод и контакты не повреждены и не ржавые; ♦ конфигурация сети позволяет направлять сетевой трафик между клиентом и сер- вером. Ограничения подсети или системы сетевой защиты могут препятствовать серверу в получении данных от клиента. • Ограничения подсети: TCP/IP может быть сконфигурирован для ограничения трафика между подсетями. Если ваша клиентская машина является частью сложной сети или подсети, уточните у сетевого администратора, имеет ли она неограниченный доступ к серверу. ВНИМАНИЕ! WNet не позволяет направлять сетевой трафик между подсетями. • Система сетевой защиты (firewall): ваша проверка соединения может дать ошибку, если сервер базы данных находится под программной или аппаратной системой сетевой защиты, которая блокирует порт 3050 или сконфигуриро- ванный вами порт. Проблемы с событиями Несмотря на то, что каждый клиент соединяется с сервером через один канал, собы- тия Firebird — механизм обратной связи, который позволяет передавать сообщения о событиях назад клиентам с помощью триггеров и хранимых процедур, — использу- ют произвольные доступные порты. В статических замкнутых сетях без внутренних систем сетевой защиты это обычно не вызывает проблем. В сетях, где существует множество подсетей, динамическая IP-адресация и строго сконфигурированная сис- тема сетевой защиты, передача событий может закончиться неудачей. В Firebird 1.0.x ваш сетевой администратор должен установить некий способ, чтобы гарантировать наличие доступного порта, который всегда свободен, открыт и являет-
84 Часть I. Учебный лагерь ся статическим. Проблема может быть решена тем или иным образом в большинстве сетей. Firebird 1.5 упрощает дело. Он делает возможным явно задавать IP-адрес в сети для трафика событий. Используйте параметр RemoteAuxPort в файле firebird.conf с целью статической установки IP-адреса для интерфейса (карта, маршрутизатор, шлюз и т. д.), который будет доступен для направления событий. Более подробно о событиях Firebird см. главу 32. Другие сетевые проблемы Если дела идут плохо, вы можете найти немало советов в приложении 2. Пора дальше Куда дальше? Если у вас все в порядке с установками сети, и вам не терпится идти дальше, переходите прямо к главе 4 для изучения "основ", которые помогут вам со- единиться с базой данных. Если же вы инсталлировали Firebird в мультипроцессор- ной системе, или вы подозреваете, что некоторые элементы конфигурации вашей машины могут вызвать проблемы, читайте дальше. Несмотря на то, что редко бывает нужным изменять конфигурацию Firebird для основных операций, в главе 3 описыва- ется несколько опций конфигурации, которые могут помочь вам избавиться от го- ловной боли.
ГЛАВА 3 Конфигурирование Firebird После инсталляции Firebird, как правило, готов к запуску. Конфигурирование не тре- буется или минимально. Если инсталляция и настройка сети прошли по плану, нет необходимости что-нибудь делать для нового пользователя, нужно лишь продолжать узнавать возможности Firebird и экспериментировать с программным обеспечением. Вы можете просто пропустить эту главу и перейти к следующей. Тем не менее, это заявление может оказаться не совсем верным для некоторых плат- форм, или когда определенная операционная система заблокировала одну или две функции автоматического конфигурирования инсталляционного скрипта или про- граммы. Данная глава будет интересна новым пользователям при решении некото- рых из этих проблем. В первом разделе главы указано, как конфигурировать переменные окружения и ре- сурсы файловой системы для использования Firebird. Здесь описывается проверка параметров конфигурации сервера, как их модифицировать в случае особого исполь- зования и требований совместимости. Конфигурация на уровне базы данных Эта глава посвящена конфигурации на уровне сервера. Один сервер Firebird может работать с несколькими базами данных одновременно. Каждая база данных может быть сконфигурирована таким образом, чтобы соответствовать предъявляемым к ней требованиям. Конфигурирование на уровне базы данных см. в главах 15 и 39. Переменные окружения Переменные окружения — глобальные установки системы, которые используются при первоначальной загрузке операционной системы. В Windows, Linux и в боль- шинстве систем UNIX сервер Firebird распознает и использует некоторые перемен- ные окружения, если они установлены. Процессы fbserver (архитектура Суперсерве- ра) и fb inet server (архитектура Классического сервера) не распознают установок, которые ссылаются на сетевые ресурсы (диски и файловые системы), не управляемые физически серверной машиной.
86 Часть I. Учебный лагерь Где устанавливаются переменные окружения Windows Тип переменных окружения и способ их установки меняется от одной версии Windows к другой. В табл. 3.1 показаны типы (если применимы) и способы установ- ки значений переменным окружения. Таблица 3.1. Установки переменных окружения для Windows Версия Windows Тип переменной Описание Наличие Windows 95/98 He применяется Используйте Блокнот и установите пере- менные окружения в autoexec.bat или config.sys. Формат установки: SET <имя_переменной> = <значение_переменной>. Пример: SET FIREBIRD=C:\PROGRA~1\FIREBIRD. Для просмотра всех текущих установок переменных окружения наберите SET в командной строке Нет Windows NT/2000/XP Переменные пользователя. Делает перемен- ные доступными для приложений, запускаемых кон- кретным пользо- вателем, если этот пользователь подключен Используется для ограничения видимости переменных определенным пользователям. Диалоговое окно Свойства системы (System Properties), доступное через апплет Система (System applet) на Панели управ- ления или через контекстное меню, появ- ляющееся при щелчке правой кнопкой мы- ши на объекте Мой Компьютер и выборе элемента Свойства Да Windows NT Выберите Расширенное окружение | Новое (Advanced Environment | New) Windows 2000/XP Выберите Расширенное окружение | Переменные окружения | Новое (Advanced Environment | Variables | New) Windows NT/2000/XP Системные пере- менные. Доступны для всей системы (все сервисы, все пользователи). Команды set за- писаны в команд- ной строке. Пере- менные доступны только процессам, запущенным из командной строки Используйте, если Firebird запущен как сервис. Выберите Расширенное окруже- ние | Переменные окружения | Новое (Advanced Environment | Variables | New) или Редактировать (Edit), если доступно Да Полезно для установки переменной окру- жения для временного использования (например, iscjjserh isc__password для упрощения доступа из утилит командной строки при выполнении задач администра- тора). Используйте SET <имя__переменной> = <значение_переменной> для установки значения переменной; используйте set <имя~переменной> =, чтобы установить пустое значение Нет
Гпава 3. Конфигурирование Firebird 87 POSIX В Linux и UNIX самый простой путь установления переменных окружения — доба- вить их определения в общесистемный профиль значений по умолчанию. Пользователь root также может: ♦ выдать команды setenv () из командной строки или командного скрипта; ♦ для временного использования установить и экспортировать переменную из командной строки, например, export isc_user=sysdba. ISCJJSERvt ISC_PASSWORD Эффект этой опасной пары переменных окружения — дать доступ с правами пользо- вателя SYSDBA к серверу Firebird и его базам данных через утилиты командной строки или клиентские приложения любому, кто может соединиться с хост-машиной. Они удобны для разработчиков. Если вы не указываете имя пользователя и пароль при локальном соединении с базой данных, или когда вы запускаете утилиты командной строки, такие как gbak, gstat или gfix, Firebird проверяет, установлены ли переменные окружения iscjjser и isc password. Если установлены, Firebird позволяет вам соединиться без указания па- роля. Никогда не оставляйте эти переменные установленными на сервере, который содержит важные базы данных, если помещение, где располагается сервер, не явля- ется физически хорошо защищенным! Переменная FIREBIRD (или INTERBASE) Если установлена переменная окружения firebird (interbase для версии 1.0.x), то она используется и при инсталляции, и в процессе работы на всех платформах для указа- ния корневого каталога сервера Firebird. Если она присутствует, то перекрываются все другие установки — значения по умолчанию инсталляционного пакета, установ- ки в реестре Windows, конфигурация в firebird.conf, значения глобальных путей опе- рационной системы и т. д. В процессе инсталляции она указывает на каталог, в котором должен быть установ- лен Firebird. Значение переменной должно задавать полный путь, который существу- ет в физической файловой системе на хост-машине. При старте сервер читает значе- ния в файле конфигурации firebird.conf (или ib_config/isc_config в версии 1.0.x), кото- рый должен находиться в каталоге, назначенном переменной firebird (или interbase). Этот каталог должен быть родительским для каталога bin, где размещают- ся двоичные файлы Firebird. Здесь также по умолчанию находятся файлы сообщений и замков: firebird.msg (interbase.msg) и hostname.lek. Ж ПРИМЕЧАНИЕ. Вы можете указать другое размещение файлов firebird.msg ь-К (interbase.msg) и firebird.Ick (interbase.lck), установив переменные окружения \__\ firebird_msg (interbase_msg) и firebirD-Lock (interbase__lock). См. следующие разделы.
88 Часть I. Учебный лагерь Если переменная firebird не установлена, будут использованы значения по умол- чанию: ♦ /opt/firebird — для платформ Linux/UNIX; ♦ C:\Program Files\Firebird (версия 1.0.x) или C:\Program Files\Firebird\Firebird_l_5 (версия 1.5) — для платформ Windows. В табл. 1.2—1.5 в главе 1 указаны точные пути. Если Firebird установлен в каталоге, отличном от каталога по умолчанию, и задана переменная firebird, то клиентская библиотека будет читать значение переменной для определения пути инсталляции. В Windows клиентские приложения могут также найти путь инсталляции, читая в реестре поле Defaultinstance, которое создается, если проводилась инсталляция толь- ко клиента. HKEY_LOCAL_MACHINE\SOFTWARE\Firebird Project\Firebird Server\Instances Более подробное обсуждение способов поиска сервером размещения этих файлов см. далее в этой главе в разд. "Корневой каталог Firebird". Информацию об установках только клиента см. в разд. "Установка клиентов" главы 7. FIREBIRD_TMP По умолчанию Firebird будет использовать глобальное пространство временных фай- лов, обычно задаваемое как системное значение по умолчанию переменной окруже- ния тмр (обсуждается далее). Переменная окружения firebird_tmp (в версии 1.0.x — interbase tmp) задает пользовательское размещение для файлов сортировки Firebird. Значение должно указывать полный путь, который существует в физической файло- вой системе хост-машины. Доступны также другие способы определения размещения этих файлов. Конфигури- рование параметра TempDirectories (tmp_directory в версии 1.0.x) описано в разд. "Файл конфигурации Firebird" и разд. "Параметры для конфигурирования простран- ства временной сортировки" главы 36. *LOCKvi *_MSG firebird_lock (interbase_lock в версии 1,0.x) устанавливает расположение файла бло- кировок. firebird_msg (interbase_msg в версии 1.0.x) устанавливает расположение файла сообщений Firebird. Эти две переменные независимы друг от друга, они могут указывать различные раз- мещения файлов. Значение должно указывать полный путь, который существует в физической файловой системе хост-машины. ТМР Пространство сортировки на серверной машине Пространство сортировки — это место на диске, где сервер сохраняет промежуточ- ные результаты (во временных файлах) для запросов, которые требуют сортировки
Глава 3. Конфигурирование Firebird 89 или используют агрегатные функции. Firebird 1.0.x для этого использует только дис- ковые файлы. Firebird 1.5, если может, сохраняет эти файлы в RAM и отправляет их надиск только в том случае, если оперативная память исчерпана. Глобальная переменная окружения тмр (или temp в некоторых системах) указывает каталог на сервере, где приложения должны сохранять временные файлы. Firebird попытается сохранить временные файлы сортировки именно здесь, если не опреде- лена переменная окружения firebird_tmp (см. разд. "FIREBIRD TMP") и в файле конфигурации Firebird не указано пространство сортировки (см. переменные TempDirectories И TMP_DIRECTORY В главе 36). Файлы скриптов isql на клиенте Интерактивная утилита командной строки isql предоставляет возможность записы- вать последовательность интерактивных команд SQL в файл скрипта при использо- вании переключателя output. На клиентской машине переменная тмр задает располо- жение этих файлов скриптов, если не было указано другого абсолютного пути. Если переменная тмр не установлена, то клиент Firebird использует любой другой времен- ный каталог, который будет найден в локальной системе, обычно tmp в файловой системе клиента Linux/UNIX или C:\Temp в клиенте Windows. Файл конфигурации Firebird Firebird не требует постоянной сложной реконфигурации, которая необходима дру- гими тяжеловесными РСУБД. Тем не менее целый ряд вариантов конфигурирования доступен для настройки сервера Firebird и хост-системы, на которой он выполняется, под ваши специальные требования. Файл конфигурации Firebird называется firebird.conf для всех версий Firebird 1.5 и выше. В предыдущих версиях его имя зависело от операционной системы: ♦ isc_config — в Linux/UNIX; ♦ ibconfig — в Windows. В версии 1.5 было добавлено несколько новых параметров. Когда стартует сервер Firebird, он читает файл конфигурации и настраивает свои флаги времени выполнения (runtime flags), если файл конфигурации содержит значе- ния, отличные от установленных по умолчанию. Данные из файла больше не будут считываться, пока не произойдет новый запуск сервера. Параметры конфигурации по умолчанию и их значения содержатся в файле конфигурации и закомментированы символом #. Нет необходимости убирать комментарий, чтобы сделать значения по умолчанию видимыми процедуре запуска сервера. Изменение параметров конфигурации Нет необходимости изменять значения по умолчанию, если только вы не собираетесь настроить некоторые из них. Это не рекомендуется делать, если вы не в полной мере понимаете, к чему это может привести.
90 Часть I. Учебный лагерь Отдельные установки конфигурации по умолчанию, которые могут быть полезными для некоторых существующих приложений или инсталляций не по умолчанию, об- суждаются здесь вкратце. Полное описание параметров конфигурации см. в главе 36. Файл конфигурации можно редактировать любым текстовым редактором (например, vim в Linux или Блокнот в Windows). Не копируйте этот файл с машины Windows в Linux и наоборот, поскольку эти системы по-разному сохраняют символы перевода строки. Записи параметров в файле firebird.conf представлены в форме: имя_параметра = значение где имя_параметра — строка, содержащая имя параметра (без пробелов), а значение — это число, логическая константа (1=Истина, 0=Ложь) или строка, которые задают значение параметра. Для задания параметру значения, отличающегося от значения по умолчанию, удалите символ примечания (#) и отредактируйте значение. Имена параметров и синтаксис в файле ibconfig/isc_config для Firebird 1.0.x отлича- ются от того, что может содержаться в firebird.conf. Формат, размер и количество параметров являются более ограниченными. Формат в ibconfig/isc config: имя_параметра значение где промежуток между именем и значением может быть символами табуляции и про- белами (по желанию, как больше нравится). Каждая строка в файле ограничена 80 символами. Неиспользуемые параметры и инсталляционные значения по умолча- нию закомментированы с помощью символа #. Помните, что в Linux параметры чувствительны к регистру. ПРИМЕЧАНИЕ. Вы можете редактировать файл конфигурации и когда сервер запущен. Для активации изменений нужно остановить и заново запустить сервер. Корневой каталог Firebird Корневой каталог инсталляции Firebird может использоваться в разных ситуациях — при инсталляции как используемый сервером атрибут, для параметров конфигурации и для клиентов. Поскольку есть разные способы сообщения серверу, где можно найти значение этого атрибута, разработчики и системные администраторы для его пра- вильного определения должны знать, в каком порядке сервер находит это значение. 1. На любой платформе сервер в первую очередь смотрит глобальную переменную окружения firebird. Если он находит эту переменную, ее значение будет исполь- зовано без всяких условий. 2. Если переменная окружения firebird отсутствует, то для платформ Windows сер- вер отыскивает ключ в реестре HKEY_LCXIAL_MACHINE\SOFTWARE\Firebird Project\Firebird ServerMnstances
Глава 3. Конфигурирование Firebird 91 и смотрит поле Defaultinstance. Если он находит в данном поле правильный путь к каталогу, то использует это значение. Другие платформы не имеют подобного указателя. 3. Если корневой каталог все еще не найден, то предполагается, что временный кор- невой каталог располагается на один уровень выше каталога запущенного процес- са (,.\ для Windows и ../ или ссылка на /ргос/self/exe для POSIX, если доступно). 4. Теперь процедура запуска ищет в этом каталоге файл firebird.config. Если файл firebird.config найден, то процедура отыскивает параметр RootDirectory. Если па- раметр присутствует, его значение становится окончательно корневым каталогом, иначе промежуточное значение из п. 3 становится окончательным значением. Д ВНИМАНИЕ! Если файл firebird.config не был найден на уровне, предшествую- щем запускаемому процессу, это может означать, что корневой каталог не был определен по причине нестандартной инсталляции. Сервер должен найти корне- вой каталог файлов. Если вам встретилась ошибка безопасности или ошибка файловой системы в процессе соединения или во время выполнения, вы должны пересмотреть ваши пути инсталляции, чтобы убедиться, что все действия, опи- санные в данном разделе, правильно определили корневой каталог файлов и подкаталоги. Параметры, связанные с доступом к файлам Firebird имеет несколько параметров для защиты его файлов и баз данных от разру- шающего или неавторизованного доступа. Если вы перемещаете приложение работы с базой данных или используете инструмент администратора для Firebird 1.5, вам следует обратиться к разд. "Файл конфигурации Firebird" в главе 36 для получения детальной информации об указанных далее параметрах. ♦ RootDirectory — может быть использован для изменения абсолютного пути к кор- невому каталогу в локальной файловой системе. Он должен оставаться закоммен- тированным, если только вы не захотите изменить процедуру запуска, перекрыв путь к корневому каталогу инсталляции сервера Firebird (см. п. 3 в предыдущем разделе). ♦ DatabaseAccess — в Firebird 1.0.x сервер может соединяться с любой базой данных в его локальной файловой системе и всегда доступен приложениям, передающим абсолютный путь к файлу в файловой системе. Этот параметр был введен в вер- сии 1.5, чтобы обеспечить более четкое управление безопасностью при доступе к файлам базы данных, а также для поддержки средства алиасов баз данных. Инсталляция по умолчанию устанавливает значение параметра в Full, чтобы ими- тировать поведение Firebird версии 1.0.x. Альтернативные режимы могут ограни- чить доступ сервера только к базам данных с алиасами или к базам данных, раз- мещенных в указанных каталогах файловой системы. Д ВНИМАНИЕ! Настоятельно рекомендуется установить этот режим и сделать доступным средство алиасов баз данных. Информацию об алиасах базы данных см. в главе 4.
92 Часть I. Учебный лагерь ♦ ExternaiFiieAccess — заменяет параметр external_file_directory, введенный в версии 1.0. Этот параметр обеспечивает три уровня безопасности для External Files (внешние файлы — текстовые файлы фиксированного формата, к которым возможен доступ, как и к таблицам базы данных). Если вы переносите базу дан- ных, в которой определены внешние файлы таблиц, вам нужно установить этот параметр для версии 1.5, потому что он отключен по умолчанию. Конфигурация необязательная, тем не менее рекомендуется для версии 1.0.x. ♦ UDFAccess — предназначен для защиты местоположения кода внешних модулей. Он заменяет не только необязательный параметр версии 1,0.x externai_function_ directory, но также и форму представления значения. Firebird 1.5 инсталлируется с отключенным по умолчанию доступом к библиотекам внешних функций, в то время как большинство серверов до этого давали полный доступ. ♦ TempDirectories (tmp_di rectory в версии 1.0.x)— конфигурирование этого пара- метра является одним из способов задания размещения временного пространства сортировки для сервера, указав местоположение на диске. Синтаксис Firebird 1.5 отличается от синтаксиса Firebird 1.0.x. Другие полезные параметры Следующие параметры могут быть полезными в некоторых аппаратных конфигура- циях. ♦ cpuAffinityMask (cpu_affinity в версии 1.0.x)— может быть использован для на- значения процессоров, которые Суперсервер в Windows будет использовать на машинах SMP. Эта проблема известна как эффект "see-saw", когда операционная система постоянно переключает выполнение Суперсервера между процессорами на некоторых машинах SMP. Свойство CPU должно быть установлено для одного процессора, если вам встретилась такая проблема. По умолчанию маска свойств устанавливается для использования первого процес- сора в массиве. ♦ LockMemSize— параметр специфичен для Классических серверов; он определяет количество байтов разделяемой памяти, которая отводится для таблицы памяти, используемой менеджером блокировки. Вам может понадобиться изменить это количество, если вы встретите в Классическом сервере ошибку "Lock manager is out of room" (Менеджеру блокировки не хватает памяти). В связи с этой пробле- мой см. также параметр LockHashsiots. ♦ SortMemBlockSize И SortMemUpperLimit — ЭТИ два параметра были добавлены В Вер- СИЮ 1.5, чтобы позволить устанавливать и ограничивать объем оперативной памя- ти, которую использует сервер при внутренней сортировке. Для Классического сервера этот размер по умолчанию слишком велик, чтобы поддерживать доста- точно большое количество соединений. ♦ Dummypacketinterval (dummy_packet_interval в 1.0.x)— параметр— пережиток 16-битовых систем; он может стать причиной проблем в 32-битовых Windows. Это был старый параметр времени ожидания InterBase, предполагалось устанав- ливать количество секунд (целое число), в течение которых сервер должен был
Глава 3. Конфигурирование Firebird 93 ожидать от клиента сообщений, после чего сервер должен был посылать пустой пакет для получения подтверждения. По умолчанию он установлен в 0 для Firebird 1.5 (неактивен) и в 60 для Firebird 1.0.x. Он должен быть неактивным (ус- тановленным в 0) для всех систем Windows. Также настоятельно рекомендуется отключать его для других операционных систем1. ♦ RemoteBindAddress — по умолчанию могут соединиться клиенты из любой сети, из которой сервер принимает трафик. Этот параметр позволяет связать сервис Firebird с исходными запросами через один IP-адрес (например, сетевая карта) и отклонять запросы соединения от любых других сетевых интерфейсов. Это помо- гает решать проблемы некоторых сетей, где сервер является хостом для несколь- ких подсетей. Не поддерживается в версии 1.0.x. ♦ compieteBooieanEvaluation — параметр может быть использован для преобразова- ния логики вычисления логических значений в виде сокращенного вычисления булевских выражений, используемой в Firebird 1.5 и выше, в полное вычисление булевских выражений, используемое в Firebird 1.0.x. ♦ oidParameterOrdering— восстанавливает старый способ обработки порядка пара- метров для запросов с подзапросами — сначала параметры подзапроса, затем па- раметры внешнего запроса. Firebird 1.5 по умолчанию обрабатывает параметры в точном порядке их следования, что может быть несовместимо со старыми вер- сиями различных компонентов доступа, которые ориентировались на поведение InterBase/Firebird 1.0. Пора дальше Теперь нам больше ничего не осталось, кроме как соединиться с базой данных и на- чать выполнять серьезные эксперименты. Глава 4, последняя в нашем "учебном лаге- ре”, даст вам возможность соединиться с примером базы данных или с любой другой совместимой с Firebird базой данных, которая может находиться на вашем сер- вере. Из-за ошибки в Windows использование DummyPacketlnterval может привести к зависа- нию или краху Windows на клиентской стороне. Объяснения см. в следующей статье Microsoft Support: http://support.microsoft.com/default.aspx?kbid=296265. Не рекомендуется его ис- пользовать и в системах, отличных от Windows. Он может даже мешать возможному отключе-
ГЛАВА 4 Основные операции Теперь у вас есть установленный сервер Firebird, что дальше? Эта глава быстро обу- чит вас основам Firebird. Запуск Firebird на Linux/UNIX Суперсервер Каталог инсталляции по умолчанию /opt/firebird. В каталоге /bin находится в двоич- ном формате сервер Firebird fbserver (ibserver для Firebird 1.0.x), который запускается как процесс-демон в Linux/UNIX. Он запускается автоматически после инсталляции посредством RPM или скрипта и каждый раз при перезагрузке сервера запуском скрипта демона firebird, находящегося в /etc/rc.d/init.d (или /etc/init.d в SuSE), кото- рый вызывает утилиту командной строки Firebird Manager— fbmgr.bin. Firebird Man- ager может быть использована из командной строки для запуска и остановки процес- са вручную. Запуск сервера Если вы по разным причинам запустили Firebird вручную, соединитесь с ним как пользователь root или firebird. Запомните, какую учетную запись вы использовали при запуске fbserver, потому что все созданные объекты будут принадлежать пользо- вателю с этой учетной записью. Если позже другой пользователь запустит процесс с использованием другой учетной записи пользователя, то эти объекты будут ему не- доступны. Настоятельно рекомендуется создать системного пользователя с именем firebird и запускать сервер Firebird с этой учетной записью. Для запуска процесса выполните из командной строки следующую команду: ./fbmgr.bin -start -forever Для версий Firebird, предшествующих 1.5, выполните: ./ibmgr -start -forever Переключатель -forever означает, что Guardian будет управлять запуском. При ис- пользовании Guardian процесс сервера будет заново запущен, если он по каким-либо причинам завершится аварийно.
Глава 4. Основные операции 95 Для запуска сервера без использования Guardian введите: ./fbmgr.bin -start -once Для версий Firebird, предшествующих 1.5, выполните: ./ibmgr -start -once Переключатель -once означает, что если сервер будет аварийно завершен, перезапус- тить его можно будет только вручную. Остановка сервера В целях безопасности убедитесь, по возможности, что все соединения с базой данных отключены, прежде чем вы остановите сервер. Переключатель -shut отменяет все текущие транзакции и прекращает работу сервера немедленно. Вам не требуется быть подключенным как пользователь root для остановки сервера Firebird fbmgr, но вы должны иметь полномочия пользователя SYSDBA. Выполните следующую команду: ./fbmgr.bin -shut -password <паролъ SYSDBA? Используйте команду для версий, предшествующих 1.5: ./ibmgr.bin -shut -password < пароль SYSDBA> Управляемое завершение работы На этой платформе Firebird не имеет утилиты для подсчета количества пользователь- ских соединений с базой данных для Суперсервера. Если вам нужно предоставить клиентам интервал времени для завершения работы и корректного отключения, за- вершайте работу индивидуальных баз данных с использованием инструмента gfix с переключателем -shut и одним из доступных аргументов для управления отключени- ем. (См. разд. "Останов базы данных" в главе 39.) Другие команды fbmgr Синтаксис Из командной строки: ./fbmgr.bin -команда [-режим [параметр] . ..] Альтернативно вы можете стартовать интерактивную сессию fbmgr или ibmgr из ко- мандной строки (например, перейдя в режим с подсказкой). Наберите: ./fbmgr <нажмите Return/Enter> для того чтобы перейти к следующей подсказке: FBMGR>
96 Часть I. Учебный лагерь В режиме с подсказкой синтаксис команд: FBMGR> команда [-режим [параметр] ...] Например, вы можете запустить сервер одним из следующих способов. Из команд- ной строки: ,/fbmgr -start -password пароль В режиме с подсказкой: FBMGR> start -password пароль Переключатели fbmgr В табл. 4.1 представлен список переключателей fbmgr и ibmgr, доступных из команд- ной строки и из режима с подсказкой. Таблица 4.1. Переключатели fbmgr/ibmgr Переключатель Аргумент Другие переключатели Описание -start -forever | once -user, -password Запускает fbserver, если он не был еще запущен -shut -user, -password Останавливает fbserver -show Показывает хост и пользователя -user Имя пользователя SYSDBA; используется с пере- ключателями -start и -stop, если пользователь системы не является root или эквивалент- ным ему -password Пароль SYSDBA Используется с переключателя- ми -start и -stop, если пользо- ватель системы не является root или эквивалентным ему -help Выводит короткий текст помощи fbmgr -quit Используется для выхода из режима с подсказками Классический сервер Классический сервер Firebird использует процессы xinetd или inetd для обработки поступающих запросов. (Применяемый процесс зависит от версии Linux.) Нет необ- ходимости явно запускать сервер. Процесс xinetd или inetd запускается автоматиче-
Гпава 4. Основные операции 97 ски; когда он получает запрос от клиента Firebird на соединение, он порождает ко- пию процесса fbinetserver для этого клиента. Как сервер прослушивает запросы на соединение Если Классический сервер Firebird был установлен инсталлятором, использующим скрипты или RPM, то файл конфигурации запуска для fbinetserver с именем firebird должен быть добавлен в сервисы, о которых знает [xjinetd. В большинстве дистрибу- тивов Linux этот файл размещается в каталоге /etc/xinetd.d. Чтобы [x]inetd "слушал" запросы на соединение от клиентов для вашего Классического сервера Firebird, скрипт firebird должен находиться в том же каталоге, где стартует процесс [xjinetd. СОВЕТ. Если [xjinetd запущен, и ни одного запроса на соединение клиента не последовало вовсе, проверьте, действительно ли скрипт firebird находится там, где он должен быть. Если нет, то вы можете выделить скрипт firebird.xinetd из файлового комплекта инсталляции, скопировать в нужный каталог и переимено- вать в firebird. Чтобы [xjinetd "видел" сервис Firebird, остановите и заново запус- тите [xjinetd. Остановка и запуск [x]inetd и его сервисов Демон [x]inetd сам является сервисом, который по запросу управляет другими серви- сами, например Классическим демоном Firebird. Остановка [xjinetd приведет к тому, что все процессы, которыми он управляет, будут также остановлены. Его запуск или повторный запуск приведет к возобновлению прослушивания запросов и запуску управляемых им процессов. Если все сервисы в каталоге ../rc.d являются безопасными для остановки, соедини- тесь как пользователь root и остановите [xjinetd следующей командой из командной строки: 4 service xinetd stop или командой: # service inetd stop Если [xjinetd не был сконфигурирован для автоматического перезапуска после оста- новки, запустите его командой1: # service xinetd restart 1 * * 4 1 По умолчанию [xjinetd в своем файле конфигурации имеет ограничение на число стартуемых экземпляров конкретного сервиса. Это может проявляться как ошибка при подключении очередного пользователя (например, невозможно подключить более 60 поль- зователей). Отредактируйте файл конфигурации [xjinetd и установите желаемый лимит количества сервисов fb_inet_server, т. е. количества подключений к Классическому серверу Firebird. — Прим. науч. ред. 4 Зак. 420
98 Часть I. Учебный лагерь Остановка процесса Firebird Если вам нужно остановить вышедший из-под контроля процесс Firebird в Классиче- ском сервере, вы можете это сделать. Найдите ошибочный процесс, выполнив команду top из командной строки. Эта утилита отображает список наиболее интен- сивно использующих CPU процессов, постоянно обновляя этот список. Любой экземпляр fb inet server с необычным использованием ресурсов должен появиться в этом списке. Выберите идентификатор (process ID, PID) ошибочного процесса fb_inet_server из самой левой колонки в списке. Вы можете использовать этот PID в команде kin для посылки сигнала ошибочному процессу. Например, для PID 12345 вы можете попы- таться остановить процесс, выдав: # kill 12345 Если процесс остается видимым в списке утилиты top, вы можете попытаться форси- ровать остановку процесса: # kill -9 12345 Д ВНИМАНИЕ! Проявляйте величайшую осторожность при использовании коман- ! X ды kill, особенно если вы подключились как пользователь root. Запуск сервера Firebird в Windows Суперсервер Выполняемая программа Суперсервера Firebird — fbserver.exe. Хотя он может запус- каться и как самостоятельная программа, он также может находиться под управлени- ем Guardian — fbguard.exe. Guardian обеспечивает возможность эмулировать автома- тический рестарт сервисов в Windows и POSIX, запущенных с переключателем -forever. Если приложение fbserver.exe аварийно завершается, Guardian пытается за- ново его запустить. Рекомендуется использовать Guardian на хостах, работающих на платформах Windows 95/98 и ME, а также NT/XP, если сервер выполняется как при- ложение. В Windows NT и Windows 2000 программа сервера Firebird может выполняться как сервис и как приложение. Инсталляция по умолчанию устанавливает сервер Firebird — и Guardian, если выбран — для автоматического выполнения как сервисы. Вариант выполнения для обоих может быть изменен, чтобы они выполнялись как приложения. В Windows 95/98, ME и ХР Home Edition Firebird может выполняться только как при- ложение. Если Firebird выполняется как приложение, на панели задач появляется со- ответствующая иконка. Некоторые задачи администрирования могут быть выполне- ны вручную при щелчке правой кнопкой мыши на этой иконке.
Гпава 4. Основные операции 99 Выполнение Firebird как сервиса в Windows NT, 2000 и ХР Если данный компьютер используется как сервер БД, то вам настоятельно рекомен- дуется выполнять сервер Firebird как сервис. ПРИМЕЧАНИЕ. Пользователи, выполняющие миграцию с InterBase 6.0 или бо- -Ж лее раннего, должны обратить внимание, что не требуется выполнения Firebird __как приложения на хост-машинах SMP, чтобы установить наличие только одного процессора. Опция сервиса Firebird по использованию количества процессоров содержится в файле конфигурации. Более подробную информацию см. в разд. "Файл конфигурации Firebird" главы 36. Запуск и остановка сервиса вручную Для остановки сервиса вручную откройте окно командной строки и введите следую- щую команду: NET STOP Firebirdserver Для старта или рестарта сервера вручную введите команду: NET START FirebirdServer /,\ ВНИМАНИЕ! Поскольку команды NET возвращают сообщения в окно командной / • \ строки, не пытайтесь запустить их в окне Выполнить (Run) через кнопку Пуск (Start). Использование утилиты instsvc Альтернативный, "родной" для Firebird способ запуска и остановки сервисов Firebird и Guardian — использование утилиты instsvc.exe, которая находится в каталоге \bin в корневом каталоге Firebird. Утилита instsvc.exe применяется системой для запуска сервиса Firebird— и Guardian, если выбран— когда выполняется первоначальная загрузка хост-сервера. Поскольку с самого начала не ожидалось частого использова- ния ее людьми — это команда в стиле DOS, содержащая переключатели. f ПРИМЕЧАНИЕ. Firebird 1.5 содержит дополнительный необязательный переклю- чатель для соединения, чтобы позволить скриптам инсталлятора добавить воз- ___У можность создания "реального пользователя"— подключенного пользователя для установки сервиса при загрузке системы. Это рекомендуется сделать, т. к. скрипты создают пользователя Firebird с ограниченными привилегиями; соответ- ственно устанавливается инсталляция сервиса. (См. разд. "Защита, основанная на платформе" в главе 33.)
100 Часть I. Учебный лагерь Останов и рестарт сервиса с использованием instsvc Откройте окно командной строки и перейдите к каталогу \bin, находящемуся в кор- невом каталоге установки Firebird. Для останова сервиса Firebird введите: C:\Program Files\Firebird\Firebird_l_5\bin> instsvc stop Для старта (рестарта) сервиса Firebird используйте одну командную строку, изменив, при необходимости, приоритет процесса: C:\Program Files\Firebird\Firebird_l_5\bin> instsvc start . [-boostpriority I -regularpriority] ПРИМЕЧАНИЕ. Эти команды не выполняют, соответственно, деинсталляцию и инсталляцию сервиса. Апплеты Firebird Manager Когда Firebird выполняется как сервис, небольшое количество административных задач, включая останов и рестарт, может быть решено с использованием апплета Firebird Manager на Панели управления. Самый простой апплет инсталлируется при установке Firebird. Более сложные апплеты, включая версии языков, можно загрузить из Firebird CVS с сайта SourceForge или с различных сайтов, связанных с Firebird. Выполнение Firebird как приложения на платформах Windows Если сервер Firebird выполняется как приложение, вы должны увидеть иконку в сис- темной области на серверной машине, как показано на рис. 4.1. Вид иконки в сис- темной области зависит от того, запущен ли только сервер, или вы управляете его выполнением с помощью Guardian. Рекомендуется использовать Guardian при вы- полнении Суперсервера как приложения и исключить его при выполнении Классиче- ского сервера. |>-ф 3:17РМ Нф ф 3:17 РМ; Guardian Server, no Guardian Рис. 4.1. Иконка на системной панели Вы не увидите иконку, если сервер не был запущен (в случае Суперсервера) или не был инициализирован (в случае Классического сервера). Пока вы не установите ре- жим автоматического запуска сервера, вам будет нужно стартовать или инициализи- ровать его вручную.
Глава 4. Основные операции 101 Запуск сервера как приложения вручную Если Суперсервер не запущен, или Классический сервер не инициализирован, он может быть запущен вручную при выборе в меню Firebird— Пуск | Все програм- мы | Firebird (Start | Programs | Firebird). Альтернативно можно стартовать сервер или Guardian из командной строки. Вызови- те окно командной строки и перейдите к каталогу \bin в каталоге инсталляции Fire- bird. Выполните следующие действия в соответствии с тем, собираетесь ли вы ис- пользовать Guardian или будете запускать сервер без возможности автоматического рестарта. Суперсервер Программа Guardian называется fbguard.exe в Firebird 1.5 и idguard.exe в более ранних версиях. Используйте следующую команду для старта Guardian: fbguard.exe -а ibguard.exe -а /★ для версии 1.0.x */ Guardian размещает свою иконку на системной панели и автоматически стартует Су- персервер. Имя программы сервера для Суперсервера fbserver.exe (ibserver.exe в Firebird 1.0.x). Для запуска Суперсервера напрямую, минуя защиту Guardian, используйте команду: fbserver.exe -а ibserver.exe -а /* для версии 1.0.x */ Сервер стартует и размещает свою собственную иконку на системной панели. Классический сервер ПРИМЕЧАНИЕ. Этот текст относится к Firebird 1.5 и следующим. Классический сервер для Windows не поддерживается в более ранних версиях. Основное преимущество выполнения Классического сервера в Windows — его воз- можность использовать мультипроцессорные системы. Эта функция недоступна в случае Суперсервера для многих систем SMP. Тем не менее, поскольку использова- ние памяти Классическим сервером находится в прямой зависимости от количества одновременных подключений, может оказаться невозможным устанавливать систему на сайтах, где ресурсы сервера не обеспечивают поддержки большого количества пользователей в системе. Процесс, который является "ушами’’ для запросов клиентов на соединение с Класси- ческим сервером, является начальным экземпляром программы fb_inet_server.exe. Если начальный экземпляр fb_inet_server.exe не запущен, то не будет возможно со- единение клиент-сервер; при попытке соединения вы получите сообщение об ошибке
102 Часть I. Учебный лагерь "Unable to connect to the server. Database cannot be found" (Невозможно соединиться с сервером. База данных не может быть найдена). Когда клиенты соединяются с базой данных, для каждого клиентского соединения запускается один экземпляр fb_inet_server.exe (1.2 Мбайт) и, если сконфигурировано, один экземпляр Guardian на все экземпляры fb_inet_server.exe. Для каждого соедине- ния выполняется собственное выделение кэш-памяти. Классический сервер и Guardian_______________________________________ Случайно или умышленно, инсталлятор Firebird 1.5.0 имеет небольшую, но приво- дящую в замешательство аномалию. Если вы не отметите в процессе инсталляции режим Use Guardian (Использовать Guardian), инсталлятор поместит версию для Суперсервера программы Guardian в каталог \bin, и он никогда не будет работать с Классическим сервером. Если вы отметите этот режим, то в процессе инсталляции получите сообщение об ошибке, однако инсталлированная версия Guardian будет прекрасно работать с Классическим сервером. Вы можете проверить, правильная ли у вас версия, попытавшись запустить Guardian. Если вы увидите диалоговое окно сообщения об ошибке, содержащее слово "fbserver", значит, вы не выбрали под- держку Guardian в процессе инсталляции. В любом случае Guardian является лишним для Классического сервера. Вы ничего не потеряете, если не будете его инсталлировать. Я рекомендую игнорировать Guardian для Классического сервера. Для запуска начального экземпляра Классического сервера как приложения вручную вызовите окно командной строки, перейдите в каталог \bin и наберите: fb_inet_server.exe -а Иконка сервера должна появиться на системной панели. Ваш сервер теперь готов к получению запросов на соединение. Вы можете альтернативно выбрать режим Use Guardian в процессе инсталляции. Вы также можете стартовать Guardian из того же каталога: fbguard.exe -с -а В этом случае иконка Guardian появится на системной панели, однако она не может быть использована для отмены инициализации сервера (см. ранее в разд. "Клас- сический сервер" замечание о Классическом сервере). Останов сервера Останов сервера— операция, которая по-разному воздействует на Суперсервер и Классический сервер. Суперсервер Щелкните правой кнопкой мыши по иконке Guardian или сервера и выберите в кон- текстном меню Shutdown (Остановить). Если выполняется Guardian, то сначала он остановит сервер, а затем закроется сам. Подключенные в этот момент пользователи потеряют всю неподтвержденную работу.
Гпава 4. Основные операции 103 Классический сервер В большинстве случаев нет необходимости "останавливать" Классический сервер. Выбор варианта Shutdown в контекстном меню иконки сервера предотвратит новые соединения с сервером, но это не будет воздействовать на подключенные процессы. ПРИМЕЧАНИЕ. Щелчок мышью по варианту Shutdown в контекстном меню Guardian ничего не выполняет. Очень редко бывает нужным (если вообще бывает) останавливать Классический сер- вер вручную, поскольку закрытие клиентского соединения завершает этот процесс чисто и корректно. Единственный способ остановить Классический сервер, который выполняется как приложение, — применение "грубой силы", через Диспетчер задач. Алиасы базы данных Firebird 1.5 ввел концепцию алиасов базы данных не только для того, чтобы облег- чить жизнь уставших от клавиатуры разработчиков, но и для того, чтобы улучшить переносимость приложений, а также чтобы усилить контроль над внутренним и внешним доступом к файлу базы данных. aliases.conf Средство алиасов включает файл конфигурации aliases.conf. Он находится в корне- вом каталоге вашей инсталляции сервера и не должен перемещаться оттуда. Переносимость До реализации 1.5 все клиентские приложения соединялись с сервером, используя строку соединения, которая включала абсолютный путь к серверу. Формат абсолют- ного пути меняется в зависимости от того, выполняется ли сервер под Windows или на POSIX-совместимой платформе (Linux, UNIX и т. д.), а для серверов под Windows еще и от того, какой вид сетевого соединения используют клиенты — TCP/IP или NetBEUI. Предположим, у вашего сервера имя hotchicken. Если сервер выполняется на POSIX- совместимой платформе; клиенты TCP/IP будут соединяться с базами данных, ис- пользуя строку соединения следующего формата: hotchicken:/opt/databases/Employee.fdb Если же сервер работает под Windows, клиенты TCP/IP должны соединяться, исполь- зуя другой формат пути: hotchicken:D:\databases\Employee.fdb Средства алиасов базы данных делают эту разницу для клиентов TCP/IP прозрачной. Абсолютный путь строки соединения помещается в файл алиасов, связывая этот путь
104 Часть /. Учебный лагерь с простым именем алиаса. Например, в файле aliases.conf для сервера под Linux наш пример может быть сохранен как dbl = /opt/databases/Employee.fdb Для сервера в Windows, инсталлированного для клиентов TCP/IP, это может быть dbl = D:\databases\Employee.fdb Независимо от того, где установлен сервер — под Windows или POSIX — строка со- единения для клиентов становится одинаковой: hotchicken:dbl Тем не менее это средство не является столь изящным, если вы хотите сделать строку соединения вашего приложения прозрачной как для соединений TCP/IP, так и NetBEUI. Нотация UNC для сервера под Windows для клиентов NetBEUI предполага- ет совместимость, однако если алиас базы данных идентичен, то серверная часть не является переносимой: \\hotchicken\dbl в сравнении с: hotchi cken:dbl Управление доступом Основное преимущество средства алиасов в том, что оно может быть использовано в комбинации с параметром DatabaseAccess = none из файла firebird.conf для ограниче- ния доступа к файлам баз данных — доступ разрешен только к файлам, указанным в aliases.conf. Алиасы баз данных появились в Firebird 1.5. Для их использования отредактируйте файл aliases.conf в корневом каталоге инсталляции Firebird, используя текстовый ре- дактор, такой как Блокнот (в Windows) или vi (Linux). Структура файла aliases.conf Инсталлированный файл aliases.conf выглядит приблизительно таким образом: # # List of known database aliases # ---------------------------- # Examples: # # dummy = c:\data\durrany.fdb # Как и во всех файлах конфигурации Firebird, символ # является маркером коммента- риев. Для конфигурирования алиаса просто удалите символ # и замените строку dummy на соответствующий путь к базе данных:
Гпава 4. Основные операции 105 # fbdbl и aliases.conf находится на сервере Windows: fbdbl = c:\Firebirdl5\sample\Employee.fdb # fbdb2 и aliases.conf находится на сервере Linux fbdb2 = /opt/databases/killergames.fdb При каждом запросе на соединение, содержащем путь, заданный в формате алиаса, сервер обращается к файлу aliases.conf. Вы можете редактировать aliases.conf и когда сервер выполняется. Изменения не будут влиять на текущие соединения, но новые соединения будут использовать новые или измененные алиасы. Соединение с использованием алиаса пути к базе данных Для соединений TCP/IP, использующих предыдущий пример aliases.conf, измененная строка соединения в вашем приложении будет иметь следующий формат: Имя_сервера: имя_алиаса Например, hotchicken:fbdb2 Для соединений Windows Named Pipes строка выглядит следующим образом: \\hotchicken\fbdb2 Для локального соединения просто используйте собственный алиас. Администрирование баз данных Множество прекрасных графических инструментов — свободно распространяемых и коммерческих— доступны для администрирования баз данных Firebird. Информа- цию о подобных предложениях см. в приложении 5. Обновляемый каталог поддер- живается на страницах Contributed Downloads на http://www.ibphoenix.com. Firebird поставляется с набором инструментов командной строки для сервера и адми- нистрирования баз данных. Обычно они работают одинаково в Linux/UNIX и в ко- мандной строке MS-DOS. Помните, что в Linux/UNIX команды, параметры и пере- ключатели являются чувствительными к регистру. В Windows — нет. Интерактивный инструмент запросов isql упомянут в этой главе и полностью доку- ментируется в главе 37. Другие инструменты командной строки описываются в сле- дующих разделах. fbmgr/ibmgr fbmgr/ibmgr является командой и интерфейсом командной строки для демона Супер- сервера в Linux для запуска и останова Суперсервера Firebird в Linux. Скрипт ко- мандной строки fbmgr (ibmgr в версии 1.0.x) предоставляет интерфейс для выполняв-
106 Часть I. Учебный лагерь мого модуля сервера fbmgr.bin (ibmgr.bin в версии 1.0.x). Детальное описание пред- ставлено в этой главе. instsvc.exe Это интерфейс командной строки сервиса Суперсервера на платформах Windows NT для инсталляции, запуска и останова Суперсервера Firebird в Windows. Детальное описание представлено в этой главе. gbak Эта утилита предназначена для резервного копирования и восстановления баз дан- ных. Поскольку она работает на уровне структур и форматов данных, gbak является единственной корректной утилитой для копирования. Она также обнаруживает раз- рушения базы данных, освобождает дисковое пространство, появившееся в результа- те удалений, разрешает незавершенные транзакции, позволяет разделять базы данных на несколько файлов. Она также используется для создания переносимой копии с целью восстановления вашей базы данных на другой аппаратной платформе или для обновления ODS (On-Disk Structure) вашей базы данных. /\ ВНИМАНИЕ! Никогда не используйте утилиты копирования файлов типа tar/gzip, / : \ WinZip, Microsoft Backup, средства копирования файловой системы или утилиты сторонних разработчиков для копирования и переноса баз данных, если сервер работает или у вас нет твердой уверенности, что база данных не повреждена. Базы данных, которые переносятся как копии файлов, будут содержать неубран- ный мусор. Подробности использования gbak см. в главе 38. gsec Этот инструмент поддержки списка пользователей и их паролей является интерфей- сом командной строки для базы данных security.fdb; он управляет записями пользо- вателей на сервере Firebird. Подробности использования gsec см. в главе 34. gfix Это набор общих вспомогательных утилит для изменения свойств баз данных, устра- нения небольших повреждений базы данных, выполнения различных задач чистки и т. д. Утилита также предоставляет средство администратора для отключения кон- кретных баз данных до завершения работы сервера. Она может быть использована вместе с утилитой gbak для восстановления некоторых типов нарушений в базе дан- ных (см. разд. "Ремонт базы данных" приложения 4). Подробности использования gfix см. в главе 39.
Гпава 4. Основные операции 107 gstat Этот инструмент получения статистики собирает и отображает статистические све- дения по индексам и данным базы данных. Подробную информацию об использова- нии gstat см. в разд. "Темы оптимизации” главы 18. fb_lock_print Эта утилита формирует статистические данные файла блокировок, который поддер- живается в Firebird для управления последовательностью изменений базы данных несколькими транзакциями. Она может быть полезным инструментом анализа про- блем взаимной блокировки. Подробности использования fb_lock_print см. в главе 40. Введение в isql Утилита командной строки isql (Interactive SQL) объединяет инструменты и техники использования SQL для поддержки объектов базы данных, управления транзакциями, отображения метаданных и обработки скриптов определения базы данных. Интер- фейс командной строки доступен на всех платформах. Настоящее краткое введение даст вам возможность начать работу по подключению к базе данных и созданию ва- шей первой базы данных. Запуск isql Есть несколько различных способов соединения с базой данных при использовании isql. Один способ — стартовать утилиту из командной строки в интерактивном ре- жиме. Для начала в окне командной строки перейдите к каталогу /bin корневого ка- талога инсталляции Firebird, где инсталлирована программа isql, и запустите isql сле- дующим образом. Для сервера POSIX: [chick@hotchicken]# ./isql <нажмите Return/Enter> Для сервера Windows: C:\Program Files\Firebird\Firebird_l_5\bin>isql < маршите Return/Entet> Утилита выведет следующее сообщение: Use CONNECT or CREATE DATABASE to specify a database (Используйте CONNECT или CREATE DATABASE для указания базы данных) Использование isql Соединившись с базой данных, вы можете выполнять запросы к ее данным и мета- данным, используя обычные операторы динамического SQL, а также специальное подмножество операторов, которые работают только в окружении isql.
108 Часть I. Учебный лагерь Оператор CONNECT Оператор connect является стандартным оператором SQL для соединения с базой данных. Здесь предполагается, что вы пока не изменили пароль у пользователя SYSDBA. Если вы это уже сделали (что рекомендуется), то используйте ваш пароль пользователя SYSDBA. Каждый из операторов командной строки в следующих примерах является одним оператором. Для соединения с сервером Linux/UNIX введите: SQL> CONNECT 'hotchicken:/opt/firebird/examples/employee.fdb' user 'sysdba' password 'masterkey'; Для соединения с сервером Windows: SQL> CONNECT ' WINSERVER: C: \Program Files\Firebird\Firebird_l_5\examples\employee. fdb' user 'SYSDBA' password 'masterkey'; ПРИМЕЧАНИЕ. В Классическом сервере под Linux и в Суперсервере под Win- -Ж dows существует возможность соединения с базой данных локально, например: connect '/opt/firebird/examples/employee.fdb' — Linux Классический сервер. CONNECT 'c:\Program Files\Firebird\Firebird_l_5\examples\employee.fdb’ — Windows Суперсервер. Убедитесь, что вы заканчиваете каждый оператор SQL символом точка с запятой (;). Если вы забудете это сделать, то увидите следующее в подсказке продолжения ути- литы isql: CON> Когда вы увидите подсказку продолжения, просто введите точку с запятой и нажмите клавишу <Enter/Return>. В этот момент isql проинформирует вас, что вы соединены: DATABASE ’hotchicken:/opt/firebird/examples/employee.fdb', User: sysdba SQL> Если сервер работает под Windows, вы увидите следующее: DATABASE "WINSERVER:C:\Program Files\Firebird\Firebird_l_5\examples\employee.fdb", User: sysdba SQL> Продолжим играть с базой данных employee.fdb. Вы можете использовать isql для запроса данных, получения информации о метаданных, создания объектов базы дан- ных, выполнения скриптов определения данных и многого другого. Чтобы вернуться к подсказке командной строки, введите SQL> QUIT;
Гпава 4. Основные операции 109 Создание базы данных с использованием isql Существует более одного способа создания базы данных с использованием isql. Здесь приведен один простой способ интерактивного создания базы данных — тем не ме- нее для работы с серьезной базой данных вы должны создавать и поддерживать объ- екты метаданных, используя скрипты определения данных (они также называются скриптами DDL, скриптами SQL, скриптами метаданных и скриптами схемы). Эта тема детально рассматривается в разд. "Скрипты схемы"главы 14. Если сейчас вы соединены с базой данных через утилиту isql, отсоединитесь с по- мощью следующей команды: SQL> QUIT; Затем заново стартуйте утилиту без соединения с базой данных. Для сервера Linux: [chick@hotchicken]# ./isql Use CONNECT or CREATE DATABASE to specify a database Для сервера Windows: C:\Program Files\Firebird\Firebird_l_5\bin>isql Use CONNECT or CREATE DATABASE to specify a database Оператор CREATE DATABASE Теперь вы можете создать вашу новую базу данных интерактивно. Предположим, что вы хотите создать базу данных test.fdb на сервере Windows и сохранить ее в каталоге data на диске D: SQL> CREATE DATABASE 'D:\data\test.fdb' user 'SYSDBA' password 'masterkey'; База данных будет создана, и через некоторое время снова появится подсказка. Те- перь вы соединены с новой базой данных и можете продолжать создавать в ней тестовые объекты. Для проверки того, что база данных действительно существует, введите запрос: SQL> SELECT * FROM RDB$RELATIONS; <нажмите Enter> Экран будет заполнен большим количеством данных! Этот запрос выбирает все строки из системной таблицы, в которой Firebird сохраняет метаданные для таблиц. "Пустая" база данных не является пустой — она содержит базу данных, которая бу- дет заполняться метаданными, как только вы начнете в ней создавать объекты. СОВЕТ. Почти все объекты метаданных в базах данных Firebird имеют иденти- фикаторы, начинающиеся с символов "RDB$".
110 Часть I. Учебный лагерь Чтобы вернуться назад в подсказку командной строки, введите: SQL> QUIT; Полную информацию по использованию isql см. в главе 37. Пора дальше Часть II рассказывает об архитектуре клиент-сервер. В главе 5 рассматривается тер- минология и различные модели реализации сетей клиент-сервер. В гпавах 6 и 7 более подробно рассматриваются серверы и клиенты Firebird соответственно.
и ЧАСТЬ II Клиент-сервер Глава 5. Введение в архитектуру клиент-сервер Глава 6. Сервер Firebird Глава 7. Клиенты Firebird

ГЛАВА 5 Введение в архитектуру клиент-сервер Обычно система клиент-сервер является парой программных модулей, разработан- ных для связи друг с другом через сеть посредством согласованного протокола. Кли- ентский модуль отправляет запросы через сеть слушающей программе сервера, а сер- вер отвечает на запросы. Например, клиент электронной почты направляет сообщение по сети на почтовый сервер с требованием к серверу перенаправить это сообщение по адресу какого-то сервера. Если запрос соответствует принятому протоколу и адрес назначения являет- ся действительным, сервер реагирует, перенаправляя сообщение и возвращая клиенту подтверждение. Ключевой принцип в том, что задача расщепляется — или распределяется — между двумя программными компонентами, которые выполняются независимо на двух фи- зически разделенных компьютерах. Эта модель даже не требует, чтобы компоненты выполнялись в совместимых операционных или файловых системах. Клиент элек- тронной почты должен быть почтовой клиентской программой, которая выполняется под Windows, Мас или любой другой операционной системой, а почтовый сервер обычно выполняется в системах UNIX или Linux. Клиентская и серверная программы способны успешно взаимодействовать, поскольку они были спроектированы функ- ционально совместимыми. В системе клиент-серверной базы данных модель идентична. На хост-машине в сети выполняется программа, которая управляет базами данных и клиентскими соедине- ниями — сервер базы данных. Он расположен на узле сети, который известен кли- ентским программам, выполняющимся в других узлах сети. Сервер слушает запросы из сети от клиентов, которые хотят соединиться с базой данных, а также от других клиентов, которые уже соединены с базами данных. В примере с электронной почтой протокол коммуникации имеет два уровня. Как и система электронной почты, система баз данных клиент-сервер использует стандарт- ный сетевой протокол и перекрывает его другими протоколами специального назна- чения. Для электронной почты перекрытие (overlay) будет POP3, IMAP и SMTP; для системы базы данных это протоколы соединения с базой данных, безопасности, пе- реноса данных и языка.
114 Часть И. Клиент-сервер Базы данных клиент-сервер в сравнении с файл-серверами Системы совместного доступа к файлам являются другим примером систем клиент- сервер. Файловые серверы и серверы файловых систем обслуживают запросы клиен- тов к файлам и файловым системам иногда весьма запутанными способами. Примеры этому— сервисы NFS, Windows Named Pipes и NetBEUI. Файловый сервер предос- тавляет клиентам доступ к файлам так, что клиентская машина может читать и пи- сать в памяти сервера, как если бы операции ввода/вывода проводились в ее собст- венной локальной системе памяти. Настольная система управления данными имеет недостаток — собственная внутрен- няя реализация управления запросами ввода/вывода, поступающими из сети, сама является клиентом файлового сервера. Когда сервер получает запросы на ввод/вывод от своих клиентов, он полагается на средства управления операционной системы для обеспечения центрального блокирования и организации очереди, необходимые для управления конфликтными запросами. Такие файл-серверные СУБД не являются клиент-серверными системами баз данных. Программное обеспечение клиента и СУБД— клиенты сервера совместного доступа к файлам. Хотя входной и часто выходной потоки являются до известной степени управляемыми программой СУБД, физическая целостность данных находится под управлением сервисов файловой системы. В базах данных клиент-сервер клиенты — даже если они расположены на той же машине, что и сервер, — никогда не обращаются к физическим данным, кроме как отправляя сообщения серверу с указанием того, что они хотят сделать. Сервер само- стоятельно обрабатывает эти сообщения и выполняет запросы, управляя обращения- ми к дискам и правами доступа. Сервер также выполняет все физические изменения метаданных и структур хранения данных, используя физическую структуру на диске (On-Disk Structure, ODS), которая независима от программ ввода/вывода файловой системы хоста. Характеристики СУБД клиент-сервер Масштабируемость Появление сравнительно недорогих компьютерных сетей между 1980-ми и 1990-ми го- дами вызвало увеличенный спрос на масштабируемые информационные системы с дружественным пользователю интерфейсом. Программное обеспечение электрон- ных таблиц и настольных баз данных, а также графический интерфейс дали пользо- вателям, не являющимся специалистами, понимание мощности использования ком- пьютеров. Когда совместное использование файлов в сетях и различного вида про- граммного обеспечения стало стандартной практикой на больших предприятиях, заказчики запросили большего. Настольные и основанные на локальных сетях (Local Area Network, LAN ) системы управления данными также стали использоваться и в весьма малых бизнесах. Сегодня практически немыслимо проектировать информаци-
Гпава 5. Введение в архитектуру клиент-сервер 115 онную систему предприятия для монолитной модели на мэйнфрейме с текстовым терминалом. Масштабируемость оценивается в двух размерностях: горизонтальной и вертикаль- ной. Горизонтальная масштабируемость — способность системы добавлять допол- нительных пользователей без воздействия на возможности программного обеспече- ния или используемые ресурсы. Вертикальная масштабируемость связана с тем, что будет сделано для переноса системы на более простые или более сложные платфор- мы и конфигурации аппаратных средств в ответ на изменение требований нагрузки и доступа. Диапазон меняется от нижнего уровня — например, сделать систему дос- тупной для пользователей мобильных устройств — до верхнего уровня, который не имеет концептуальных ограничений. Функциональная совместимость Архитектура клиент-сервер для систем баз данных развивалась как ответ на уязви- мость, низкий уровень нагрузки и ограничения по скорости модели базы данных со- вместного доступа к файлам в компьютерных сетях при потребности увеличения ко- личества пользователей. Острая необходимость в этом совпала с параллельной раз- работкой языка SQL. Оба направления отчасти были стратегиями нейтрализации зависимости аппаратного обеспечения мэйнфреймов и программного обеспечения, которая преобладала в 1980-х годах. Настоящая архитектура баз данных клиент- сервер является неоднородной и функционально совместимой (интероперабель- ной) — она не ограничивается одной платформой аппаратных средств или одной операционной системой. Эта модель позволяет клиентам и серверам независимо раз- мещаться в узлах сети на аппаратных средствах и в операционных системах, соответ- ствующих их функциям. Приложения клиентов могут одновременно связываться с множеством серверов, выполняющихся в различных операционных системах. Защита данных Огромный недостаток систем файл-серверных баз данных— незащищенность дан- ных от ошибок, повреждений и разрушения по причине их физической доступности при совместном использовании файлов клиентами и установления над ними прямого контроля со стороны человека. В модели базы данных клиент-сервер приложения клиентов никогда не работают с физическими данными. Когда клиентский запрос изменяет состояние данных, сервер подвергает запрос строгой проверке. Он отверга- ет запросы, которые не соответствуют внутренним правилам или правилам метадан- ных. Когда выполняется успешный запрос на запись данных, фактическое изменение состояния базы данных полностью выполняется кодом, находящимся в модуле сер- вера, а структура диска находится под контролем сервера. Распределение функций Модель клиент-сервер позволяет отдельным фрагментам работы системы быть эф- фективно распределенными между компонентами аппаратуры и программного обес-
116 Часть II. Клиент-сервер печения. Сервер базы данных заботится о хранении, управлении и поиске данных, а через хранимые процедуры, триггеры и другие вызываемые процессы он обеспечива- ет большое количество возможностей обработки данных системы. Процесс клиента является "острием" приложений, транслируя их запросы в структуры коммуникации, которые формируют протоколы для доступа к базам данных и к данным. Приложения являются динамическим уровнем в этой модели. Они обеспечивают по- тенциально бесконечное множество интерфейсов, через которые люди, машины и внешние программные процессы взаимодействуют с клиентским процессом. В этой части клиентский модуль представляется приложениям через понятный, предпочти- тельно стандартизованный, независимый от языка программирования интерфейс прикладного программирования (Application Programming Interface, API). В некоторых системах приложения могут действовать почти полностью как постав- щики информации и приемники ввода, виртуально делегируя все операции манипу- лирования данными серверу базы данных. Это является идеалом клиент-серверных систем, поскольку локализует задачи, интенсивно использующие центральный про- цессор, и позволяет приложениям использовать возможности рабочей станции для лучшей реализации интерфейса пользователя. На другом конце шкалы находятся системы, в которых из-за плохого проектирования или из-за отсутствия функциональной совместимости вся обработка данных вирту- ально производится на клиентских рабочих станциях. Для таких систем часто бывает характерным плохо выполненный интерфейс пользователя, задержки при синхрони- зации состояния базы данных и ненадежность взаимодействия с сетью. Между небесами и адом находятся хорошо выполненные системы баз данных кли- ент-сервер, которые прекрасно используют возможности обработки на серверах, со- храняя некоторые функции обработки данных на рабочих станциях, когда это оправ- дано сокращением сетевого трафика или повышением гибкости выполнения задач. Двухуровневая модель Рис. 5.1 иллюстрирует классическую двухуровневую модель клиент-сервер. Проме- жуточный уровень, который может присутствовать или отсутствовать, представляет собой драйвер, такой как ODBC, JDBC, PHP, или компонент доступа к данным, кото- рый интегрирован с программным кодом приложения. Возможны и другие уровни на клиентской стороне. Приложения также могут быть написаны с использованием прямого доступа к API без промежуточного уровня. SERVER CLIENT Рис. 5.1. Двухуровневая модель клиент-сервер
Гпава 5. Введение в архитектуру клиент-сервер 117 Многоуровневая модель Увеличение возможностей масштабирования и требования большей функциональной совместимости прйводят к модели с большим количеством уровней, как показано на рис. 5.2. Клиентский интерфейс перемещается в центр модели; он объединяется с одним или более уровнями сервера приложений. В этом центральном комплексе бу- дут расположены средства промежуточного уровня и сетевые модули. Уровень при- ложения становится некоторым видом суперклиента базы данных — иногда обслу- живая множество серверов баз данных — и сам становится Proxy-сервером (серве- ром-посредником) для запросов к базам данных от приложений. Он может быть размещен на том же аппаратном оборудовании, что и сервер базы данных, но также может выполняться и на своем оборудовании. APPLICATION SERVER APPLICATION CLIENT DATABASE SERVERS Рис. 5.2. Многоуровневая модель клиент-сервер Стандартизация Признанные стандарты функциональной совместимости аппаратного и программно- го обеспечения, и особенно языка запросов и описания метаданных, являются харак- терной чертой систем баз данных клиент-сервер. Развитие систем реляционных баз данных и консолидация стандартов SQL более двух десятилетий было и остается не- разделимым. Абстрактная природа хорошо спроектированных систем реляционных баз данных вместе с их относительной нейтральностью по поводу выбора языка при- ложения для "предварительной обработки" гарантируют, что реляционные СУБД продолжают занимать свое место в качестве предпочтительной архитектуры систем клиент-сервер. Тем не менее это не отменяет другие архитектуры. Хотя в настоящее время объекты систем баз данных продолжают оставаться тесно связанными с языками приложения, объектно-реляционные архитектуры становятся значительным посягательством на реляционные традиции. Самые последние стандарты SQL представляют некоторые положения по стандартизации объектно-реляционных методов и синтаксиса. Когда
118 Часть II. Клиент-сервер люди начинают требовать стандарты для технологий, обычно это хороший индика- тор того, что технология может быть востребованной в скором времени. Проектирование систем клиент-сервер Факт, что системы клиент-сервер должны быть спроектированы для использования в сетях. Для новичков часто бывает потрясением открытие того, что "молниеносно вы- полняемая" задача, которая работала в приложении под Paradox или Access, занимает весь день после конвертирования в клиент-серверную реляционную СУБД. "Что-то не так в Firebird, — говорят они. — Это не может быть код моего приложе- ния — потому что я не изменял ничего! Это не может быть результатом моего проек- тирования базы данных — потому что то же проектирование было безупречным мно- гие годы!" Знаменитые последние слова. Основа проектирования клиентов для настольных систем резко отличается от проек- тирования удаленных клиентов в архитектуре клиент-сервер. Обязательный интер- фейс просмотра в настольных системах, где отображаются "200 000 записей за один раз", создал крупную отрасль RAD разработки компонентов DBGrid, связанных с данными (data-aware components). Разработчику никогда не нужно думать о том, ка- кое количество человек в состоянии просмотреть 200 000 записей в день, пусть толь- ко одним взглядом! Эти компоненты в RAD, которые выполнили такую замечательную работу по пред- ставлению неограниченного объема данных в настольных системах в небольших контейнерах для произвольного просмотра, не являются дружественным интерфей- сом для удаленных клиентов. Если ранее характерная клиентская операция цикла ("начать с первой записи и для каждой записи повторить"), казалась идеальной для обработки данных, которые размещались в памяти как локальные таблицы, то теперь удаленные пользователи клиентских компьютеров требуют принести им голову раз- работчиков на блюде. Действительно, общим является то, что на проектирование базы данных наиболее сильно влияет восприятие клиентского интерфейса — "Мне нужна таблица, похожая на эту электронную таблицу!"— а не элегантная мудрость абстрактной модели данных. Когда интерфейс физически отделен от данных через уровень изоляции транзакции и через сеть с загруженным каналом, то требуется больше размышления. Для выполне- ния миграции с настольной системы требуется много больше, чем просто преобразо- вания данных. Максимальное преимущество критического пересмотра проектирова- ния для пользователей, целостности базы данных и эффективности выполнения будет весьма оправданной работой. Абстракция хранимых данных Даже в современных системах клиент-сервер можно найти слишком много плохо выполняющихся, подверженных ошибкам приложений, которые были "спроектиро- ваны" с использованием отчетов и электронных таблиц в качестве основы для проек-
Гпава 5. Введение в архитектуру клиент-сервер 119 тирования базы данных и пользовательского интерфейса. В итоге существует слиш- ком много общего при переходе от настольных баз данных к Firebird с множеством следующих недружественных для платформ клиент-сервер "возможностей". ♦ Распространенная избыточность структур, которая перешла от электронных таб- лиц к базам данных с одними и теми же элементами данных, повторяющихся во многих таблицах. ♦ Иерархические структуры первичных ключей (нужны во многих настольных сис- темах баз данных для реализации зависимостей), что нарушает уточненную мо- дель ограничений внешнего ключа в зрелых реляционных базах данных. ♦ Большие составные символьные ключи, составленные из столбцов реальных дан- ных. ♦ Недостатки нормализации, приводящие к большому количеству записей содер- жащих много повторяющихся групп и редко требуемой информации. ♦ Большое количество частично совпадающих друг с другом индексов, не являю- щихся необходимыми. Это не говорит о том, что старые настольные системы не были хорошими. Они впол- не успешно выполняли свои задачи. Технология клиент-сервер просто очень сильно отличается от "настольных" баз данных. Эта технология меняет масштаб управления информацией с "обратиться к файлу такому-то и выбрать" на "хранить, управлять и манипулировать". Она переносит приложение клиента с роли настольной системы, как главного действующего лица, на роль переносчика сообщений. Эффективные клиентские интерфейсы являются легкими и очень элегантными в том, как они вы- полняют желания пользователя и выдают ему нужную информацию. Отбрасывание идеологии электронных таблиц Обшей характеристикой приложений настольных баз данных является то, что они предоставляют интерфейс в виде таблицы: данные представляются в виде строк и столбцов с полосами прокрутки и другими элементами навигации для просмотра с первой строки до последней. Часто эти таблицы представляют собой визуальную структуру, которая в точности воспроизводит структуру метаданных исходных таб- лиц. Обычная ловушка— импортировать такие таблицы в систему клиент-сервер и считать, что задача миграции выполнена. Перенос таких старых баз данных в систему клиент-сервер обычно требует большего, чем создание программы конвертирования данных. Выполните ваше конвертирова- ние и будьте готовы рассматривать объекты вашей базы данных как основу для даль- нейшей работы. Запланируйте выполнить заново анализ и новое проектирование по- лученного абстрактного стиля базы данных в структуры, которые будут хорошо ра- ботать в новом окружении. В Firebird очень просто создать новые таблицы и записать в них данные. Для хранения используйте простые ключи; преобразовывайте структу- ры больших таблиц в группу связанных нормализованных отношений; переносите группы повторяющихся столбцов в отдельные таблицы; изменяйте структуры клю- чей, которые уменьшают уровень зависимостей; устраняйте дублирование данных ит. д.
120 Часть II. Клиент-сервер Если вы находитесь в недоумении по поводу нормализации и выделения главных признаков, посмотрите специальные книги или сайты. Начните работу с небольших моделей данных (подмножество из пяти или шести основных таблиц является иде- альным) вместо того, чтобы использовать базу данных из 200 таблиц, как если бы это было единой задачей, которую вы должны решить за один день. Таким образом, кон- вертирование становится упреждающей практикой самообучения, а быстрое решение трудных задач становится более интуитивным. Например, изучите хранимые про- цедуры и триггеры и проверьте, что вам известно о написании модулей конвертиро- вания данных. Таблицы для вывода Основной частью начального проектирования реляционной базы данных является представление всех любимых отчетов, электронных таблиц и наиболее используемых отображений в виде таблиц базы данных. Все это является выходными данными, ко- торые выбираются с помощью запросов и хранимых процедур. Пользовательский интерфейс Клиентские приложения в системе, где информационные сервисы предприятия име- ют серверную программу, которая является полнокровной СУБД с мощными воз- можностями обработки данных, не изменяют вводимые пользователем данные после выполнения синтаксического разбора их исходного вида и упаковывания кода в под- готовленные контейнеры — в структуры транспортных функций API. Циклам for над сотнями и тысячами строк в клиентском буфере набора данных нет места на клиент- ском компьютере в системах клиент-сервер. Разработчик приложения должен постоянно думать о стоимости лишней работы. Пе- редача огромного объема данных по сети для просмотра перегружает сеть и разоча- ровывает пользователя. Необходимо сосредоточиться на эффективных способах по- каза информации пользователям и на получении данных от них— инструкции и новые данные, которые люди хотят добавлять. Разработка пользовательского интер- фейса должна фокусироваться на быстрых и интуитивно понятных техниках получе- ния вводимых строк и быстрой передачи их на сервер для требуемой обработки. Разработчики систем клиент-сервер могут научиться многому, просматривая интер- фейсы различных сайтов, даже если их приложения не разрабатываются для работы в Интернете, потому что браузер является очень тонким клиентом. Короткие быстрые запросы держат пользователя в курсе о состоянии базы данных и уменьшают загрузку сети. Эффективные клиенты базы данных предоставляют дета- лизированный интерфейс поиска, а не браузер таблиц, и ограничивают набор строк в количестве не более чем 200. Модель хранения реляционных данных Реляционные базы данных используют надежные структуры данных с высоким уровнем абстракции для эффективного получения предсказуемых корректных ре- зультатов операций. Полный анализ сущностей и процессов вашей системы является основной деятельностью, таким образом вы приходите к логической модели, которая свободна от избыточности и представляет любое отношение.
Глава 5. Введение в архитектуру клиент-сервер 121 Первичный ключ В процессе логического анализа первичный ключ (primary key) устанавливается для всех сгруппированных данных. Логический первичный ключ помогает определить, какой элемент (или группа элементов) способен однозначно идентифицировать груп- пу связанных данных. Физическое проектирование таблиц будет отображать логиче- скую группировку и уникальность характеристик модели данных, хотя структуры таблиц и ключевые столбцы, созданные в черновом варианте, не часто в точности соответствуют модели. Например, в таблице Employee уникальный ключ состоит из полей имени и фамилии и др. Поскольку составной уникальный ключ в модели дан- ных включает элементы большого размера, которые могут приводить человека к ошибкам, в таблицу должен быть добавлен столбец в качестве суррогатного первич- ного ключа. Реляционные СУБД предполагают, что каждая строка в каждой таблице имеет уни- кальный столбец для однозначной идентификации строк, для проверки соответствия условиям поиска и для связи элементов данных и потоков1. Отношения Отношения в модели представлены ключами в таблицах. Теоретически каждое от- ношение в модели должно быть реализовано в виде пары связанных между собой ключей. Когда ключи связаны между собой через ограничение внешнего ключа, таб- лицы становятся связанными в сеть зависимостей, которые отображают взаимодей- ствие групп данных независимо от контекста. Основные правила логики сервера ссылаются на эти зависимости для поддержания ссылочной целостности базы дан- ных. Стандарты SQL формулируют правила, описывая как зависимости целостности должны работать. От разработчика реляционной СУБД зависит решение, каким обра- зом будут реализовываться и поддерживаться эти зависимости. В зависимости от реализации конкретного сервера могут быть технические причины для отмены некоторых ограничений ключа без формального объявления и реализа- ции таких ограничений альтернативными способами. Например, большинство реля- ционных СУБД обязательно требуют неуникальных индексов для элементов колонок внешнего ключа. При некоторых условиях распределения данных могут быть неже- лательны индексы для таких колонок, если может быть использован другой способ защиты целостности. Реляционная СУБД может реализовать отношения, которые не используют ключей. Например, она может получать наборы данных, основываясь на сравнении значений или на выражениях, включающих значения различных столбцов одной таблицы или столбцов из нескольких таблиц. Язык запросов SQL, структуры хранимых данных и логические умения разработчика приложения объединяются, чтобы уменьшить сетевой трафик в системе клиент- сервер и отобразить точные результаты пользовательских запросов. 1 Строго говоря, наличие уникального ключа в таблице не является обязательным для ре- ляционных баз данных, хотя его наличие весьма желательно. — Прим, перев.
122 Часть II. Клиент-сервер "Руки прочь" от доступа к данным Реляционные СУБД, разработанные для архитектуры клиент-сервер, не предостав- ляют пользователям прямой доступ к данным. Когда пользовательское приложение хочет выполнить операции над набором данных, оно сообщает клиентскому модулю, чего оно хочет, и клиентский модуль "договаривается" с сервером об удовлетворении этой потребности. Если запрос отвергается по какой-то причине, то именно клиент- ский модуль сообщает "плохую новость" приложению. Если приложение запрашивает набор данных для чтения, то клиентский модуль берет результат выполнения сервером операции и передает его приложению. Данные, ви- димые приложению, являются образом состояния исходных данных в базе данных на момент начала "переговоров" между клиентом и сервером. Этот образ, который ви- дят пользователи, отключен — или изолирован — от базы данных. "Момент изоля- ции" может не совпадать с тем моментом, когда сервер получает запрос. В окруже- нии клиент-сервер, где предполагается, что более чем один пользователь читает и пишет данные, каждый запрос имеет контекст. Множество пользователей и параллельность СУБД разработана для того, чтобы обеспечить работу множества пользователей с образами хранимых данных и, чтобы можно было использовать изменяющие запро- сы, которые могут влиять на работу других пользователей. В этой ситуации нужны способы управления параллельностью. Параллельность — это набор условий, в ко- торых предусмотрена ситуация, когда запросы двух или более пользователей изме- няют одну и ту же строку таблицы в одно и то же время (т. е. параллельно). Развитые СУБД, такие как Firebird, реализуют некую схему, при которой каждый запрос вы- полняется в параллельном контексте. Стандартный термин для такого параллельного контекста транзакция— не путайте с "бизнес-транзакциями", которые часто реали- зуются в приложениях баз данных. Транзакции Для бывших пользователей настольных баз данных транзакция является одной из наиболее запутанных абстракций в реляционных СУБД архитектуры клиент-сервер. В настольных базах данных и программах электронных таблиц это понятие исполь- зуется для гарантии того, что если пользователь щелкнет по кнопке Сохранить и кнопка станет серого цвета, то значит операция выполнена. Также факт, что как только до разработчика дойдет, что такое транзакция, они склоняются к отказу от "идеологии электронных таблиц", которая была у них все те годы, когда старая мо- дель баз данных казалась совершенной. В Firebird все общение между клиентом и сервером происходит в контексте транзак- ций. Даже чтение небольшого количества строк таблицы не может быть выполнено, если не запущена транзакция. Транзакция стартует, когда приложение запрашивает об этом клиента. С момента, когда транзакция начинается и пока она не закончит- ся — опять же по запросу приложения, — общение клиента и сервера открыто, при- ложение может просить клиента выполнять запросы. В этот период выполняются
Глава 5. Введение в архитектуру клиент-сервер 123 операции по изменению состояния базы данных, и осуществляется запись на диск. Однако они не изменяют состояния базы данных и являются обратимыми. Транзакции завершаются, когда приложение обращается к клиенту, чтобы он запро- сил сервер подтвердить (commit) всю работу, выполненную с момента старта тран- закции (даже если ничего не выполнялось, кроме чтения), или в случае ошибок отме- нить всю работу (rollback). Правило атомарности гласит: "Если одно из изменений оканчивается неудачей и требует отмены по причине невозможности подтверждения, то все ожидающие завершения изменения в этой транзакции также должны быть от- менены". Отмена включает любые изменения, которые были сделаны триггерами и хранимыми процедурами в процессе выполнения этой транзакции. СОВЕТ. Для разработчика приложения очень полезно делать видимой каждую единицу работы с базой данных в виде задачи или группы задач, которые были завершены в контексте транзакции. Условия выполнения транзакций могут быть сконфигурированы различными способами. Например, один уровень изоляции выдаст иной вид сообщения о конфликте, чем другой уровень. Большинство эф- фективных программ приложений знает об этих вариантах и учитывает их в такой мере, что контекст каждой транзакции распространяется до рамок рабочей об- ласти приложения, окружающей действительную физическую транзакцию. Транзакции настолько важны в системах клиент-сервер, что в настоящем руковод- стве им посвящены три главы. 25, 26 и 27. Пора дальше Далее в главе 6 мы рассмотрим, как работают различные модели сервера Firebird и системы управления масштабированием от однопользовательской автономной сис- темы до смешанных сетей с сотнями одновременно работающих пользователей.
ГЛАВА 6 Сервер Firebird Сервер Firebird — это программа, которая выполняется на узле хоста в сети, и слу- шает клиентов с порта коммуникации. Она обслуживает запросы множества клиен- тов к множеству баз данных. Суперсервер (Superserver) является многопоточным процессом, который запускает новый поток для каждого соединившегося клиента. В модели Классического сервера (Classic server) новый процесс запускается для каждого соединения. Серверы Firebird могут выполняться почти на любом оборудовании персональных компьютеров и принимать клиентские соединения от приложений, выполняющихся в совершенно других операционных системах. С одной стороны, небольшой и легкий дистрибутив сервера может быть установлен на устаревшем оборудовании, даже для старых процессоров Pentium в операционной системе Windows 95 или в минималь- ных системах Linux. С другой стороны, серверы Firebird выполняются на распреде- ленном оборудовании, управляя базами данных размерами в терабайты1. Конечно, нереально планировать информационную систему предприятия, выпол- няющуюся под Windows 95. Тем не менее проще простого запустить минимально сконфигурированный сервер, а по необходимости в дальнейшем масштабировать его как по вертикали, так и по горизонтали. Серверы Firebird существуют в двух вариан- тах — Суперсервер и Классический сервер для удовлетворения различных потребно- стей пользователя. Оба могут быть масштабированы как вверх, так и вниз для обра- ботки от самых простых до наиболее сложных конфигураций. Программное обеспечение сервера Firebird эффективно использует системные ресур- сы хост-компьютера. Суперсервер использует приблизительно 2 Мбайта памяти. Каждое клиентское соединение Суперсервера добавляет примерно 115 Кбайт к ис- пользуемой сервером памяти — меньше или больше в зависимости от характеристик приложений клиента и способа проектирования базы данных. Каждое соединение Классического сервера запускает собственный серверный процесс, требующий при- близительно 2 Мбайта памяти. Требуемая серверу кэш-память зависит от конфигурации и от выбранного варианта Firebird. Обычная конфигурация кэша для сети при одновременно работающих 20—40 пользователях, скорее всего, будет 16, 32 или 64 Мбайта для Суперсервера, 1 Трудно определить, какой возможен максимальный размер баз данных Firebird. Пользо- ватели сообщают о базах данных в 900 Гбайт, которые еще "продолжают расти".
Гпава 6. Сервер Firebird 125 использующего общий пул для всех соединений. Для каждого Классического сервера назначается статический кэш с размером по умолчанию 75 Кбайт. Серверы вер- сии 1.5 также будут использовать RAM для ускорения сортировки, если память дос- тупна. Требуемое дисковое пространство для минимальной инсталляции Firebird со- ставляет от 9 до 12 Мбайт в зависимости от платформы. Дополнительное дисковое пространство требуется для временного хранения данных в процессе выполнения операций, дополнительная память также требуется для кэширования страниц базы данных. Эта память конфигурируется в соответствии с запросами обработки данных и вероятного объема и типа обрабатываемых данных. Роль сервера Работа сервера включает: ♦ управление хранением данных базы данных и выделение дискового пространства; ♦ управление всеми транзакциями, запущенными клиентами, гарантирование, что каждая получит и сохранит непротиворечивый образ постоянно хранимых дан- ных, требуемых клиенту, ♦ управление подтверждением транзакций, данными и сборкой мусора; ♦ поддержку блокировок и статистики для каждой базы данных; ♦ обработку запросов на добавление, изменение или удаление строк и поддержку текущих и устаревших версий записей; ♦ поддержку метаданных каждой базы данных и обслуживание запросов клиентов по созданию новых баз данных и объектов базы данных, изменение структур, проверку и компиляцию хранимых процедур и триггеров; ♦ обслуживание клиентских запросов на получение результирующих данных и вы- полнение хранимых процедур; ♦ маршрутизацию сообщений для клиентов; ♦ поддержку кэшированных данных для хранения часто используемых наборов данных и индексов; ♦ отдельную поддержку безопасности баз данных для проверки доступа пользова- телей. Платформы для операционных систем Платформы сервера Firebird включают следующие операционные системы, но не ог- раничиваются только ими. ♦ Linux, FreeBSD и другие варианты ОС UNIX. ♦ Платформы Microsoft Windows, поддерживающие сервисы: NT 4, Windows 2000 (сервер или рабочая станция), ХР Professional и Server 2003. Операционные сис- темы Windows 9х, ME и ХР Ноте могут быть использованы как сервер, который прослушивает порты протокола TCP, но не Named Pipes (NetBEUI).
126 Часть II. Клиент-сервер ♦ Mac OS X (Darwin). ♦ Sun Solaris SPARC и Intel. ♦ HP-UX. Примеры топологий Сервер Firebird существует в нескольких "моделях", которые обеспечивают множест- во режимов масштабирования — от однопользовательского варианта, независимой настольной системы, до мощного сервера. Двухуровневая архитектура клиент-сервер На рис. 6.1 изображена гибкая система, где множество серверов Firebird выполняют- ся на платформах с различными операционными и файловыми системами. Здесь при- сутствует смесь рабочих станций, на которых выполняются удаленные клиенты, каждый на своей платформе. Здесь же существуют шлюзы для других сетей. Сервер Windows обслуживает повседневную обработку деловых данных и располагает большим объемом дискового пространства. Для клиентов Windows возможно обще- ние с сервером Windows с использованием протокола Named Pipes — обычно назы- ваемым NetBEUI, — хотя такой протокол должен быть заменен по возможности на TCP/IP. Сервер Linux может обслуживать системы сетевой защиты, шлюзы, вспомогательные базы данных и другие системы клиент-сервер, включая электронную почту, Интернет и сервисы файлов, такие как NFS и Samba. Linux TCP/IP Суперсервер на Windows Приложения Windows TCP/IP TCP/ P Linux TCP/IP TCP/IP SYSDBA Клиент WAN Классический сервер под Linux Локальная консоль и удаленное Обслуживает репликацию и вспомогательные БД Удаленное администрирование и другие приложения Рис. 6.1. Двухуровневая топология клиент-сервер в Firebird Сервер предприятия Неоднородная сеть обслуживания баз данных является общей средой для Firebird. В небольших сетях с единственным сервером, где местный администратор может не входить в штат сотрудников, существует тенденция переносить сервер базы данных
Глава 6. Сервер Firebird 127 с одного узкоспециализированного хоста, работающего под Windows, на дешевую машину Linux с хорошей оперативной памятью и быстрым доступом к данным. Под- держка недорогая, что делает возможным передачу большинства административных функций другим организациям. Системы, подобные этой, могут расти без каких-либо сложностей. Однопользовательская модель Все серверы Firebird могут работать с локальными клиентами. Протоколы соедине- ния и режимы меняются в соответствии с выбранной вами моделью сервера. Одно- пользовательские инсталляции делятся на две категории: ♦ Независимый сервер. В этой модели сервер инсталлируется и запускается на ма- шине. Локальные соединения осуществляются с использованием протоколов в стиле сетевых, используя обычные клиентские библиотеки. ♦ Встраиваемый сервер. Никакой сервер не инсталлируется. Сервер находится в DLL, похожей на клиентскую библиотеку, и загружается приложением. Приложе- ние вместе с DLL сервера выполняется как единственный процесс на одно соеди- нение. Когда приложение завершается, то фактически завершается и работа сер- вера. Клиент-сервер В автономной модели клиент-сервер локализованное клиентское подключение к вы- полняющемуся серверу выполняется с использованием локального протокола. Сер- вер может прослушивать подключения от удаленных клиентов во время подключен- ного локального клиента. Рис. 6.2 иллюстрирует этот режим. Клиенты Windows Суперсервер и Классический Рис. 6.2. Автономные серверы
128 Часть II. Клиент-сервер Первый пример показывает модель локального подключения. В Firebird 1.5 и ниже подсистема IPSERVER моделирует сетевое подключение в том же блоке пространст- ва общения между процессами. В версии 1.5 и выше вместо локального протокола используется более быстрая и надежная подсистема XNET. Функциональный эквива- лент локального подключения используется Классическим сервером в POSIX. В двух других примерах в Windows, Linux или на любой другой поддерживаемой платформе Суперсервер использует локальную "заглушку" (loopback) протокола TCP/IP. Это обычное подключение TCP/IP к специальному IP-адресу 127.0.0.1, кото- рый большинство подсистем TCP/IP инсталлирует по умолчанию для локального хоста (localhost). В Linux Классический сервер версии 1.5 может применяться в этом режиме при использовании клиентской библиотеки libfbclient.so. Встраиваемый сервер Встраиваемые серверы поддерживаются на платформах Windows и Linux/UNIX, хотя реализация моделей различна. Под Windows библиотека встроенного сервера, кото- рый выполняется как единый процесс, называется fbembed.dll. В Linux/UNIX это стандартный режим локального подключения для Классического сервера. Библиоте- ка libfbclient.so запускает один процесс Классического сервера (fbjnetserver или ib inet server) и напрямую соединяется с базой данных. Процесс не является исклю- чительным — удаленные клиенты могут одновременно соединяться с базой данных, используя fbclient.so, другую библиотеку libfbclient.so или fbembed.dll. Более подробно встроенные серверы обсуждаются в главе 7. Серверы Firebird в среде DTP Детальное обсуждение среды распределенной обработки транзакций (Distributed Transaction Processing, DTP) не является целью данной книги. Достаточно сказать, что Суперсервер или Классический сервер Firebird хорошо подходят к различным сценариям DTP. Open Group, определившая стандарт Х/Open для DTP, предоставила три программ- ных компонента для системы DTP. Спецификация ХА определяет интерфейс между менеджером транзакций и менеджером ресурсов (Resource Manager, RM). Система имеет один RM-модуль для каждого сервера; требуется каждый RM для регистрации менеджера транзакций. На рис. 6.3 показано, как сервер Firebird может быть представлен в ХА-совместимой среде DTP. Модуль сервера приложения базы данных представляет собой мост меж- ду приложениями пользователя высокого уровня и RM, инкапсулирующим соедине- ние ХА. RM выполняет роль клиента связи с сервером базы данных для доступа к данным. Инкапсуляция соединения ХА дает возможность разработчику приложения создавать и выполнять операторы SQL в RM. Разграничение транзакций, которое требуется средствам двухфазного подтверждения для всех серверов, регулируется глобальным
Гпава 6. Сервер Firebird 129 монитором обработки транзакций (Transaction Processing Monitor, TPM). Транзакции с несколькими базами данных, находящиеся под управлением менеджера транзакций, выполняются с помощью процесса двухфазного подтверждения. В первой фазе тран- закции подготавливаются для подтверждения; во второй фазе транзакции либо пол- ностью подтверждаются, либо откатываются2. ТРМ проинформирует вызывающий модуль, если транзакция не будет по разным причинам завершена. Рис. 6.3. Firebird в распределенной среде выполнения транзакций ТРМ согласовывает распределенные транзакции в системах множества баз данных, так что одна транзакция может использовать один или более процессов и изменять одну или более баз данных. Монитор хранит информацию обо всех доступных и включенных в транзакции RM. Среда поддерживает множество баз данных для одного сервера и множество серве- ров, которые не обязательно все должны быть серверами Firebird. Версия 1.5 и выше Firebird не поддерживает использование одной базы данных несколькими серверами или обслуживание базы данных, находящейся вне компьютера, где установлен сервер Firebird. Основы сервера транзакций Сервер транзакций Microsoft (Microsoft Transaction Server, MTS) с COM+ является одним из таких сценариев. MTS/COM+ обеспечивает среду для объединенных в пул процессов, которая осуществляет использование и управление компонентами бизнес- логики, включая контроль системы, безопасность и мониторинг выполнения. Одной из наиболее значимых возможностей является декларативное управление транзак- циями. Транзакции, инициированные в MTS/COM+, управляются координатором * 5 2 О двухфазном подтверждении транзакций см. в главе 25. 5 Зак. 420
130 Часть II. Клиент-сервер распределенных транзакций (Microsoft Distributed Transaction Coordinator, DTC), ме- неджером ресурсов ХА. Родной интерфейс Firebird требует провайдера ODBC или OLE DB, который поддерживает как двухфазное подтверждение транзакций Firebird, так и контекст вызова MTS/COM+3. Терминальные серверы Firebird успешно используется в средах MTS и IBM Citrix. Во всех случаях использу- ется протокол TCP/IP для соединений по сетевым IP-адресам. /А ВНИМАНИЕ! Весьма нежелательно инсталлировать на одном и том же узле / ! \ терминальный сервер и сервер базы данных. Тем не менее в ситуациях, когда сервер приложения выполняется на том же узле, что и сервер базы данных, со- единение должно осуществляться с использованием IP-адреса этого узла или по имени locahlost. Базы данных Каждая база данных располагается в одном или более файлах, которые динамически увеличиваются при возникновении такой необходимости. Файлы базы данных долж- ны храниться на дисках, находящихся под физическим управлением машины, где располагается сервер. Только серверный процесс может выполнять прямые операции ввода/вывода для файлов базы данных. Файл базы данных Firebird состоит из блоков, называемых страницами. Размер стра- ницы базы данных может быть 1, 2, 4, 8 или 16 Кбайт; он устанавливается во время создания базы данных. Размер страницы может быть указан при создании, и изменен только во время восстановления базы данных из резервной копии при задании нового значения. Различные базы данных на одном и том же сервере могут иметь различные размеры страниц. Сервер поддерживает множество различных типов страниц в каждой базе данных — страницы данных, различные уровни индексных страниц, страницы BLOB, служеб- ные страницы для различной информации и т. д. Сервер располагает страницы в по- рядке, известном только ему. В отличие от файловых СУБД Firebird хранит таблицы не в виде физических строк и столбцов, а в непрерывном потоке на страницах. Когда страница заполняется почти полностью, и нужно записать еще строки, сервер выде- ляет новую страницу. Страницы одной таблицы не хранятся в виде непрерывной по- следовательности. Фактически страницы, содержащие данные одной таблицы, могут располагаться в нескольких файлах на разных дисках. 3 Рекомендуется свободно распространяемый драйвер IBProvider Дмитрия Коваленко. Подробности см. на http://www.ibprovider.com/rus/index.html.
Гпава 6. Сервер Firebird 131 Программирование на стороне сервера Среди мощных средств Firebird по динамическому программированию приложений клиент-сервер существует возможность компилировать на сервере исходные коды в двоичную форму для использования во время выполнения. Такие процедуры и функ- ции выполняются полностью на сервере, возвращая клиентскому приложению при необходимости значения или наборы данных. Firebird предоставляет два стиля про- граммирования на стороне сервера: хранимые процедуры и триггеры. В дополнение к этому внешние функции (или функции, определенные пользователем — User-Defined Functions, UDF) могут быть написаны на языке высокого уровня и стать доступными серверу для использования в выражениях SQL. Хранимые процедуры Язык процедур Firebird (PSQL) реализует расширения его языка SQL, предоставляя логику условий, структуры управления потоками выполнения, обработку исключе- ний (как встроенных, так и определенных пользователем), локальные переменные, механизм событий и возможность получать входные аргументы почти всех типов данных, существующих в Firebird. Он реализует мощную структуру управления по- током для обработки курсоров, что позволяет помещать наборы данных напрямую в память клиента без необходимости создания временных таблиц. Такие процедуры вызываются клиентом оператором select; разработчикам они известны как селектив- ные процедуры. Хранимые процедуры могут включать другие хранимые процедуры и могут быть рекурсивными. Все выполнение хранимой процедуры, включая выбор набора данных из процедур и внутренние вызовы других процедур, находится под управлением од- ной транзакции, которая вызвала процедуру. Соответственно, вся работа, выполнен- ная при вызове хранимой процедуры, может быть отменена при откате клиентом этой транзакции. Триггеры Триггеры являются особыми процедурами, созданными для определенных таблиц с целью автоматического выполнения в процессе завершения добавлений, изменений или удалений на сервере. Любая таблица может иметь произвольное количество триггеров, которые будут выполняться до или после добавлений, изменений или уда- лений. Порядок выполнения определяется параметром позиции в объявлении тригге- ра. Триггеры имеют некоторые расширения языка, недоступные для хранимых про- цедур или в динамическом SQL. Например, контекстные переменные old и new, при использовании которых в качестве префикса к имени столбца можно получить дос- туп к существующему (старому, old) и требуемому (новому, new) значению столбца. Триггеры могут вызывать хранимые процедуры, но не другие триггеры. Работа, выполненная триггерами, будет отменена, если транзакция, явившаяся при- чиной вызова триггера, будет отменена.
132 Часть II. Клиент-сервер Функции, определенные пользователем Для сохранения своего малого объема Firebird поставляется с весьма скромным арсе- налом встроенных (родных) функций трансформации данных. Пользователи могут писать свои собственные функции на известном им языке, таком как C/C++, Pascal или Object Pascal, для получения аргументов и возвращения единственного результа- та. Как только внешняя функция (UDF) будет определена в базе данных, она тут же станет доступной как допустимая функция SQL для приложений, хранимых про- цедур и триггеров. Firebird поставляет две готовые к использованию библиотеки UDF: ibudf, доступ- ную как для Windows, так и для Linux, и fbudf, доступную в настоящий момент для Windows и Linux в версии 1.5 и доступную только для Windows в версии 1.0.x. Firebird отыскивает UDF в библиотеках, находящихся в каталоге Zudf каталога ин- сталляции или в других каталогах, указанных в параметре udfAccess (версия 1.5) или externai_function_directory (версия 1.0.x) в файле конфигурации Firebird. Приложения, работающие с несколькими базами данных В отличие от многих реляционных баз данных приложения Firebird могут быть одно- временно соединены более чем с одной базой данных. Клиент Firebird может откры- вать и иметь доступ к любому количеству баз данных в одно и то же время. Таблицы из разных баз данных не могут быть объединены для получения связанного набора данных, но для комбинирования информации могут использоваться курсоры. Если требуется согласованность между базами данных, Firebird может управлять вы- ходными наборами данных, выполняя запросы к нескольким базам данных в контек- сте одной транзакции. Firebird обеспечивает автоматическое двухфазное подтвер- ждение транзакции (2РС) при изменениях в данных, чтобы гарантировать, что изме- нения не будут применены в одной базе данных, если изменения в другой базе данных в контексте той же транзакции были отменены или потеряны из-за ошибок в сети. Безопасность сервера Для управления доступом пользователей к серверу Firebird использует базу данных безопасности security.fdb (isc4.gdb в версии 1.0.x). Во время инсталляции эта база данных содержит одного пользователя — SYSDBA. ♦ В инсталляции Windows пароль пользователя SYSDBA masterkey. Настоятельно рекомендуется немедленно после инсталляции запустить программу gsec.exe (в каталоге инсталляции, подкаталоге /bin) и изменить этот пароль. Это один из наиболее известных паролей в мире баз данных! ♦ Инсталляторы RPM версии 1.5 для Linux генерируют случайный пароль для SYSDBA и заменяют в базе данных старый пароль masterkey. Этот пароль сохра-
Гпава 6. Сервер Firebird 133 няется в корневом каталоге инсталляции в текстовом файле с именем firebird.PASSWORD. Если вы собираетесь использовать данный пароль, то удали- те этот файл. Пользователь SYSDBA имеет полные привилегии ко всем базам данных на сервере; в текущей модели безопасности он не может быть изменен. Пользователь root в Linux/UNIX получает привилегии SYSDBA автоматически. Владелец базы данных (пользователь, создавший базу данных) имеет полные права на эту базу данных. Для всех других пользователей доступ к объектам базы данных возможен только через предоставление им привилегий SQL. Безопасность базы данных Все пользователи, за исключением тех, кто имеет полные привилегии, должны полу- чить права к каждому объекту, к которому они должны иметь доступ. SQL-оператор grant используется для назначения привилегий. Firebird поддерживает роли SQL. Вначале роль должна быть создана с использовани- ем оператора create role и подтверждена (commit). Группа привилегий может быть назначена роли, а затем роль может быть назначена пользователю. Для использова- ния этих привилегий пользователь должен при соединении с базой данных указывать и имя пользователя, и имя роли. Более подробную информацию о безопасности баз данных см. в главе 35. Пора дальше В главе 7 мы более внимательно рассмотрим клиентскую сторону в архитектуре кли- ент-сервер Firebird: библиотеку функций, которая предоставляет приложениям такие уровни системы, как средства связи и язык SQL. Если вам нужна помощь в инсталля- ции удаленного клиента, перейдите к последнему разделу этой главы.
ГЛАВА 7 Клиенты Firebird Клиенту на удаленной рабочей станции требуется клиентская библиотека и прило- жение (программа), которое может взаимодействовать с интерфейсом прикладного программирования (Application Programming Interface, API), объявленным в этой библиотеке. Клиентская библиотека предоставляет протокол соединения и транспортный уро- вень, которые ваше клиентское приложение использует для связи с сервером. Стан- дартная библиотека для клиентов Windows — это Windows DLL. Для клиентов POSIX это совместно используемый объект (библиотека SO). Размер стандартной клиентской библиотеки приблизительно 350 Кбайт. Некоторые уровни доступа, как, например провайдер Firebird .NET и драйверы JayBird Java, не требуют наличия клиентской библиотеки и напрямую реализуют се- тевой протокол. Еще один режим существует во встраиваемом сервере — библиоте- ка, которая объединяет клиентский и серверный экземпляры для использования од- ним пользователем. Клиентская рабочая станция также может иметь копию текущего файла firebird.msg или его локализованную версию для того, чтобы отображались корректные сообще- ния сервера. Обычно вы будете инсталлировать копию клиентской библиотеки на сервере для ис- пользования с некоторыми утилитами командной строки Firebird и/или для различ- ных программ управления, выполняющихся на сервере, которые вы могли бы использовать. Тем не менее многие из этих утилит могут запускаться удаленно. Ад- министратор системы может управлять некоторыми из основных сервисов, предос- тавляемыми этими утилитами для доступа к ним, через интерфейс управления услу- гами на хосте. Что такое клиент Firebird? Клиент Firebird — это приложение, обычно написанное на языке высокого уровня, которое предоставляет конечному пользователю доступ к средствам и инструментам системы управления базами данных Firebird и к данным, хранимым в базах данных. Интерактивная утилита isql и другие утилиты командной строки в вашем каталоге Firebird /bin являются примерами клиентских приложений.
Гпава 7. Клиенты Firebird 135 Клиенты Firebird обычно располагаются на удаленных рабочих станциях и через сеть соединяются с сервером Firebird, выполняющимся на хост-машине. Firebird также поддерживает автономную модель, позволяющую клиентским приложениям, клиент- ской библиотеке Firebird и серверу Firebird выполняться на одном физическом уст- ройстве. Клиентские приложения могут и вовсе не взаимодействовать с конечными пользова- телями. Клиентами могут быть демоны, скрипты и сервисы. Firebird был спроектирован для неоднородных сетей. Клиенты, выполняющиеся в одной операционной системе, могут иметь доступ к серверу на другой платформе операционной системы. Общий случай— наличие рабочих станций под Windows (98 или ME) и Linux, одновременно имеющих доступ к корпоративному серверу, вы- полняющемуся под WindowsNT или Windows 2000, либо под какой-нибудь разно- видностью UNIX или Linux. В модели клиент-сервер приложения никогда не обращаются к базе данных напря- мую. Любой процесс приложения общается с сервером через клиентскую библиотеку Firebird, копия которой должна быть инсталлирована на каждой клиентской рабочей станции. Клиентская библиотека Firebird предоставляет API, через который програм- мы выполняют обращения к функциям для поиска, сохранения и манипулирования данными и метаданными. Обычно другие уровни также вовлечены в этот интерфейс между программой приложения и клиентом Firebird, который использует обычные или специфичные для языка приложения механизмы для заполнения базы данных или вызова функций API. Для разработок Java постоянно поддерживаемые в Firebird драйверы включают JayBird JDBC/JCA-совместимый драйвер Java для гибкого, независимого от плат- формы интерфейса приложения между множеством открытых и коммерческих сис- тем разработки Java и базами данных Firebird. Открытые и сторонние интерфейсные компоненты и драйверы доступны для множества других платформ разработки, включая Borland Delphi, Kylix и C++ Builder, коммерческие и открытые варианты C++, Python, PHP и DBL'.Perl. Для приложений .NET провайдер Firebird .NET посто- янно совершенствуется. Контактные адреса и другую информацию см. в приложе- нии 3. Клиентская библиотека Firebird Клиентская библиотека Firebird поставляется во множестве вариантов, которые обра- батывают идентичные API-функции приложений для версии сервера, к которому они обращаются. В табл. 7.1 в конце этой главы представлены имена и размещение этих библиотек. В большинстве случаев клиентская библиотека использует клиентские сетевые про- токолы операционной системы для связи с одним или более серверами Firebird, реа- лизуя специальный интерфейс для архитектуры клиент-сервер Firebird на уровне приложения поверх сетевого протокола.
136 Часть II. Клиент-сервер Не смешивайте версии клиента и сервера Важным является соответствие версии клиентской библиотеки и версии сервера. Используйте клиент версии 1.0.x с сервером версии 1.0.x и клиент версии 1.5 с сер- вером версии 1.5. Помните также, что клиент версии 1.5 может быть инсталлирован в тот же каталог, что и клиент 1.0, а может быть поставлен в отдельный каталог. При переустановке новой версии изучите файл README и документацию по инсталляции (размещается в корневом каталоге инсталляции Firebird и в подкаталоге /doc на сервере), чтобы выяснить, какая информация данной книги устарела. Все клиентские приложения и промежуточное программное обеспечение должны использовать API для доступа к базам данных Firebird. API Firebird имеет обратную совместимость с API InterBase. Документ "InterBase API Guide" (Руководство no API InterBase), доступный в Borland, содержит полное описание API для разработки вы- сокопроизводительных приложений. Более поздние возможности документированы в официальных замечаниях по релизу Firebird и в ограниченном объеме в заголовоч- ных файлах, поставляемых с Firebird1. Разработка приложений Когда вы создали и заполнили данными базу данных, ее содержимое может быть доступно через клиентское приложение. Некоторые клиентские приложения — такие как инструмент Firebird isql и ряд прекрасных коммерческих и открытых инструмен- тов администратора базы данных — предоставляют возможности интерактивной вы- борки данных и создания метаданных. Любое приложение, разработанное в качестве интерфейса пользователя к одной или более базам данных Firebird, будет использовать язык запросов SQL для определения сохраняемых наборов данных и для передачи серверу операторов SQL, запрашиваю- щих операции с данными и метаданными. Firebird реализует множество операторов SQL, синтаксис которых имеет высокий уровень соответствия с признанным стандартом SQL-92. API Firebird предоставляет полные структуры для компоновки операторов SQL и связанных параметров и для получения приложениями результатов. Динамические приложения клиент-сервер Во время выполнения программы приложениям часто бывают нужны операторы SQL, которые создаются или изменяются приложениями или вводятся пользователя- ми. Приложения обычно предоставляют пользователю списки выбора, извлекаемые из таблиц базы данных, которые используют пользователи для указания критериев поиска желаемых ими данных, и операции, которые они хотят выполнить. Программа конструирует запросы на основании выборов пользователя и управляет найденными данными. 1 Список ссылок на документальные источники см. в приложении 12.
Гпава 7. Клиенты Firebird 137 Клиентские приложения используют динамический SQL (DSQL) для создания запро- сов во время выполнения. Клиент Firebird объявляет API как библиотеку функций, которые передают сложные структуры записей, формируют протокол на уровне дан- ных для связи между приложением и сервером. ПРИМЕЧАНИЕ. Программирование с использованием API — большая тема. Ее описание выходит за рамки данной книги. Но поскольку динамический SQL сам не \ X предоставляет некоторых функций, здесь описываются отдельные функции API, чтобы помочь вам понять, как драйверы и интерфейсные компоненты делают их доступными в соответствующих средах проектирования. Ядро API Firebird Программирование с использованием API необходимо при написании драйверов для создания сценариев в таких языках, как РНР и Python, и при разработке объектно- ориентированных классов доступа к данным для объектно-ориентированных языков типа Java, C++ и Object Pascal. Приложения также могут быть написаны с прямыми вызовами функций API без посредничества драйверов. Эти приложения "прямого API" могут быть мощными, гибкими, быстровыполняемыми, небольшого размера и с прекрасным управлением распределением памяти. Функциональные категории ядра API Функции API (все их имена начинаются с isc_) делятся на восемь категорий. ♦ Соединение с базой данных и отсоединение от базы данных — например, isc_attach_database(). ♦ Запуск, подготовка, подтверждение и откат транзакций — например, isc_start_transaction(). ♦ Вызовы выполнения операторов — например, isc_dsql_describe (). ♦ Вызовы BLOB — например, isc_biob_info (). ♦ Вызовы ДЛЯ массивов — например, isc_array_get_slice (). ♦ Безопасность базы данных — например, isc_attach_database (). ♦ Информационные вызовы — например, isc_database_info (). ♦ Преобразования даты и целых — например, isc_encode_date (). Более подробную информацию по программированию прямого API см. в "API Guide" документации по InterBase 6, опубликованной фирмой Borland. Интерфейсы приложений при использовании API Приложения, которые используют общие интерфейсы типа ODBC или JDBC, осно- ваны на операторах DSQL, располагающихся ниже пользовательских интерфейсов, таких как построители запросов и др.
138 Часть II. Клиент-сервер В связи с увеличением числа инструментов быстрой разработки приложений (Rapid Application Development, RAD) за последнее десятилетие инкапсуляция функций API в "обертку" классов и компонентов разработчикам под Firebird предоставлены разно- образные привлекательные средства создания приложений. Объектно-ориентированные классы Объектно-ориентированные классы и компоненты доступа к данным инкапсулируют вызовы функций и структуры данных API. Все они имеют свойства и методы, кото- рые анализируют и выполняют синтаксический разбор запрашиваемых операторов, а также управляют возвращаемыми результатами. Богатые классы включают методы и свойства, которые поддерживают специальные возможности Firebird, такие как рас- пределенные транзакции, обработка массивов, параметризованные операторы. Боль- шинство наборов компонентов реализует, по меньшей мере, один класс компонента- контейнера для буферизации одной или более строк, возвращаемых клиенту в виде результирующего набора. Некоторые реализуют продвинутые техники, такие как прокручивание курсоров, "живые данные", обратные вызовы и управление транзак- циями. Драйвер JayBird Туре 4 ("родной") JDBC поставляет интерфейс, предназначенный для независимой от платформы разработки на Java с использованием Firebird. Неко- торые наборы компонентов устанавливаются в качестве интерфейса разработчиками, использующими Delphi, Kylix и C++ Builder для написания клиентов баз данных Firebird. Двумя лучшими наборами компонентов являются IB Objects и FIBPlus. Дос- тупны некоторые другие наборы компонентов, осуществляющие минимальную под- держку возможностей Firebird. Более подробную информацию см. в приложении 3. Встроенные приложения Firebird Firebird предоставляет две различные встраиваемые модели: приложения встроенно- го SQL (Embedded SQL) и встраиваемые серверы. Приложения встроенного SQL В этой модели программа приложения включает в себя интерфейс клиент-сервер и уровень приложения конечного пользователя— все в одном исполняемом модуле. Операторы SQL находятся непосредственно в исходном коде программы, написан- ной на С, C++ или другом языке программирования. Затем исходный код приложе- ния обрабатывается препроцессором gpre, который отыскивает блоки кода, содержа- щие операторы SQL. Он подставляет макровызовы функций, которые функционально эквивалентны функциям динамической библиотеки API. Когда работа препроцессора завершается, все выполненные преобразования операторов SQL компилируются вме- сте с приложением. Такие операторы перед компилированием называются статиче- ским SQL. В таком стиле приложений доступно специальное расширенное подмножество ис- ходных команд, похожих на SQL. Встроенный SQL (Embedded SQL, ESQL) предос-
Гпава 7. Клиенты Firebird 139 тавляет программисту простой язык высокого уровня в виде "черного ящика", в то время как gpre выполняет всю работу по преобразованию сложных языковых струк- тур в эквивалентные вызовы API. Эти статические операторы дают незначительное увеличение скорости по сравнению с динамическим SQL, поскольку не требуют до- полнительных затрат на синтаксический разбор и интерпретацию операторов SQL во время выполнения. Язык и техники ESQL подробно не обсуждаются в данной книге. Документ "InterBase Embedded SQL Guide" ("Руководство по встроенному SQL InterBase", EmbedSQL.pdf), доступный в Borland, содержит описания, необходимые для разра- ботки встроенных приложений Firebird. Приложения встраиваемого сервера В модели встраиваемого сервера не существует преобразований операторов SQL. Клиент и сервер объединяются в одну компактную динамическую библиотеку для получения независимого приложения. Приложение загружает библиотеку во время запуска точно так же, как обычное приложение Firebird будет загружать клиентскую библиотеку, функции API вызываются во время выполнения. При этом нет необхо- димости инсталлировать внешний сервер, потому что такой клиент внутренне связы- вается со своим собственным экземпляром серверного процесса Firebird. Когда при- ложение завершается, оно выгружает встраиваемый сервер, так что не сохраняется никакого серверного процесса. Хотя здесь не используется и не эмулируется сетевое соединение, объединенное при- ложение клиент-сервер получает доступ к базе данных тем же способом, что и другие динамические приложения клиентов Firebird. Существующий код приложений, напи- санный для использования в обычной сети клиент-сервер, работает без каких-либо изменений со встраиваемым сервером. Встраиваемый сервер под Windows Библиотека встраиваемого сервера fbembed.dll, включенная в инсталлятор Fire- bird 1.5 для Windows, имеет архитектуру, аналогичную Firebird SuperServer. Если вы планируете инсталлировать и использовать fbembed.dll, обратите внимание на специ- альные инструкции по размещению библиотек и исполняемых программ Firebird. Измененные файлы README и другие заметки обычно размещаются в каталоге /doc серверной инсталляции. Вы можете инсталлировать встраиваемый сервер и выполнять приложения встраи- ваемого сервера на машине Windows, на которой также находится Суперсервер или Классический сервер Firebird, хотя удаленные клиенты не могут соединяться с базой данных, с которой работает приложение встраиваемого сервера. В релизе 1.5, где не лучший протокол IPSERVER все еще используется для связи клиента и сервера, воз- можно использование библиотеки встраиваемого сервера в качестве клиента других серверов. В более поздних версиях, где протокол IPSERRVER заменен на XNET, это невозможно. Firebird 1.0.x не содержит варианта встраиваемого сервера для Windows.
140 Часть II. Клиент-сервер Встраиваемый сервер под Linux/UNIX Встраиваемый сервер является "родным" режимом доступа локального клиента к Классическому серверу Firebird в Linux/UNIX, включая и версию Firebird 1.0.x. Биб- лиотека встраиваемого сервера для локального доступа— libfbembed.so для Firebird 1.5 и выше и libgds.so для Firebird 1.0.x. Как и версия IPSERVER для Windows, встроенный клиент в Linux/UNIX может так же работать, как удаленный клиент с другим Классическим сервером Firebird. При этом клиент не будет потокобезопасным (thread-safe). Для многопоточных приложе- ний необходимо использовать обычный клиент libfbclient.so. В Firebird 1.0.x удален- ный клиент поставляется в комплекте Суперсервер для Linux и двусмысленно назван libgds.so, как и встроенный клиент Классического сервера. ВНИМАНИЕ! Клиент Суперсервера для Linux является клиентом, поддержи- вающим потоки для многопоточных приложений, однако он не поддерживает выполнения нескольких потоков в одном и том же соединении с базой данных. Отдельные экземпляры соединения должны быть созданы для каждого потока. Сервисы API Открытый код InterBase 6 — на основе которого был разработан Firebird — обраба- тывает в первую очередь обращения к функциям интерфейса API для некоторых дей- ствий сервера, таких как копирование/восстановление, получение статистических данных и управление пользователями. Многие из этих обращений предоставляют программный интерфейс для инструментов командной строки. Небольшое количест- во функций сервера низкого уровня включает также некоторые функции, перекры- вающие функции ядра API. Некоторые организации разработали и распространяют сервисные компоненты, ин- капсулирующие вызовы функций сервисов API из среды разработки Delphi, Kylix и C++ Builder. Большинство из них доступны для свободной загрузки с сайтов авторов или сообщества Firebird. Более подробную информацию см. в приложении 3. В Firebird 1.0.x сервисы API и сервисные компоненты работают только с серверами типа Суперсервер. В Firebird 1.5 Classic сервисы API полностью поддерживаются только начиная с версии 1.5.2. В версиях 1.5.0 и 1.5.1 Classic поддерживаются только некоторые функции — такие как вызов модулей gbak (копирование/восстановление) и gfix (обслуживание базы данных). Инсталляция клиентов Инсталляция удаленных клиентов является основной частью установки ваших при- ложений баз данных в сети клиент-сервер. Если вы новичок в Firebird и сетях клиент- сервер, вам рекомендуется пропустить этот раздел, пока вы не получите возможность поэкспериментировать с клиентами, выполняющимися локально — на той же маши- не, что и сервер.
Гпава 7. Клиенты Firebird 141 Каждой машине удаленного клиента требуется клиентская библиотека, которая соот- ветствует версии сервера Firebird. Обычно допустимым является использование кли- ентской библиотеки из другой сборки (build) релиза — при условии, что номера вер- сий совпадают. Тем не менее при обновлении сервера прочтите документацию README, поступающую с конкретным релизом, для определения того, где можно использовать более ранние клиентские версии. Внимательно просмотрите системные пути на каждой клиентской рабочей станции, на которой вы собираетесь инсталлировать клиента Firebird, для удаления при необ- ходимости существующих клиентских инсталляций InterBase или Firebird. ♦ В Firebird 1.0.x клиентские библиотеки используют те же имена и размещение, что и его двойник InterBase. Хотя возможно так установить приложения, чтобы они использовали переименованную клиентскую библиотеку, тем не менее, стро- го рекомендуется исключить размещение приложений Firebird 1.0.x и InterBase на одной и той же рабочей станции, если вы не уверены, что ваши приложения сконфигурированы так, чтобы отыскивать и использовать правильную библио- теку. ♦ Firebird 1.5 и более поздние версии под Windows может сосуществовать с InterBase и Firebird 1.0.x на сервере и клиенте. В Firebird 1.5 все еще имеют значе- ние ручные установки, хотя с меньшими неприятностями, чем в версии 1.0.x. В версиях более поздних, чем 1.5, множество серверов и версий могут быть авто- матически инсталлированы в Windows. Инсталляция клиента Linux/UNIX Операционные системы POSIX являются весьма своеобразными. Присутствующие в этом разделе советы должны быть полезными в качестве руководства по инсталляции клиентов для большинства разновидностей Linux и UNIX, однако это область, где сомнения являются несомненными! 1. Подключитесь к клиентской машине как пользователь root и найдите клиентскую библиотеку в инсталляции сервера: • в Firebird 1,0.x ее имя libgds.so.O, размещение по умолчанию /usr/lib; • в Firebird 1.5 двоичные файлы удаленного клиента libfbclient.so. 1.5.0 инстал- лированы по умолчанию в /opt/firebird/lib. ВНИМАНИЕ! В поставке Классического сервера есть клиентская библиотека с именем libfbembed.so.1.5, которая может быть использована для встроенных приложений. Не используйте ее для удаленных клиентов. 2. Скопируйте библиотеку в /usr/lib на клиенте и создайте символическую ссылку на нее, используя следующие команды: • для версии 1.0.x: In -s /usr/lib/libgds.so.O /usr/lib/libgds.so
142 Часть II. Клиент-сервер • для версии 1.5 (две ссылки): In -s /usr/lib/libfbclient.so.1.5 /usr/lib/libfbclient.so.О In -s /usr/lib/libfbclient.so.0 /usr/lib/libfbclient.so 3. Создайте каталог/opt/firebird (/opt/interbase для версии 1.0.x) на клиенте для файла сообщений и скопируйте этот файл из корневого каталога Firebird на сервере: • для версии 1,0.x скопируйте interbase.msg в /opt/interbase/; • для версии 1.5 и выше скопируйте firebird.msg в /opt/firebird/. 4. В системном профайле оболочки по умолчанию или вызовом setenvo создайте переменную окружения, которая позволит найти утилиту для сообщений API: • для версии 1.0.x создайте переменную InterBase и свяжите ее с /opt/interbase/; • для версии 1.5 и выше создайте переменную firebird и свяжите ее с /opt/firebird/. Инсталляция клиента Windows Firebird 1.0.x В Windows клиентская библиотека всегда по умолчанию инсталлировалась в сис- темный каталог. По умолчанию это C:\WINNT\system32 для Windows NT и 2000, C:\Windows\system32 для Windows ХР и Server 2000 и C:\Windows\ или C:\Windows\system2 для Windows 9х и ME. В Firebird 1.0.x в качестве временной меры сохраняются старые имена и местоположение. Использование инсталлятора Firebird Самый простой способ инсталлировать клиента Firebird 1.0.x— это скопировать ин- сталлятор Firebird на компакт-диск или флэш-память и запустить его на клиентской машине, выбрав установку только клиента в диалоговом окне инсталлятора. Вы мо- жете инсталлировать клиента с инструментами командной строки или без них. Боль- шинству клиентов не нужны эти инструменты; не рекомендуется устанавливать их на клиентских рабочих станциях, где не требуется доступ администратора к серверу. Инсталлятор создаст корневой каталог по умолчанию в C:\Program Files\Firebird; это размещение вы можете изменить в соответствующем диалоге инсталлятора. Сюда он запишет файл сообщений interbase.msg и, если были выбраны для инсталляции инст- рументы командной строки, создаст каталог \bin, куда поместит эти инструменты. Он запишет в системный каталог gds32.dll и, если библиотека времени выполнения Microsoft С старая или вовсе отсутствует, запишет туда же msvcrt.dll. Под конец он запустит программу instreg.exe для инсталляции ключей в системном реестре. Если вы выбрали каталог инсталляции по умолчанию, ключ будет 2 На этих платформах, не имеющих поддержки сервисов, размещение может быть иным. Необходимо проверять, установлены ли предыдущие клиенты Firebird или InterBase.
Гпава 7. Клиенты Firebird 143 HKLM\Software\Borland\InterBase. ЕСЛИ какие-нибудь выполняющиеся программы бы- ли перезаписаны в процессе инсталляции, вам будет предложено перезагрузить ма- шину. Инсталляция клиента вручную Инсталляция клиента вручную требует выполнения всех предыдущих шагов. Вам нужно скопировать файлы gds32.dll, interbase.msg и instreg.exe на дискету или флэш- память. Также скопируйте из системного каталога msvcrt.dll, если на ваших клиентах она не установлена. Создав корневой каталог Firebird, скопируйте туда interbase.msg. Затем запустите с диска instreg.exe, набрав в окне командной строки: А:\> instreg.exe 'C:\Prograia Fiies\Firebird.' Если вы создали корневой каталог Firebird где-нибудь в другом месте, укажите этот путь как аргумент корневого каталога. Скопируйте gds32.dll и, если нужно msvcrt.dll, в системный каталог. f ПРИМЕЧАНИЕ, msvcrt.dll является библиотекой времени выполнения для многих программ, скомпилированных компилятором Windows С. gds32.dll — это имя кли- ___£> ентской библиотеки для серверов InterBase, а также Firebird 1.0.x. В случае если вы не можете скопировать одну из библиотек или обе по причине их использова- ния другой программой, необходимо остановить ту программу и повторить про- цесс копирования. Если все еще невозможно переписать библиотеки по причине того, что аварийно завершившаяся программа не выгрузила их, перезагрузите компьютер в безопасном режиме и выполните этот шаг. Firebird 1.5 и выше Firebird версии 1.5 и последующие клиентские инсталляции поставляются с большим количеством режимов с целью избежать "ужаса DLL" в системном каталоге Windows. До тех пор, пока сторонние инструменты, драйверы и компоненты не научатся пони- мать изменения в клиентской части Firebird 1.5, Firebird 1.5 будет поддерживать соб- ственные "ужасы DLL". Инсталляция клиента по умолчанию почти наверняка будет несовместимой с программным обеспечением, созданным с использованием таких RAD-продуктов Borland, как Delphi или C++ Builder. Внимательно прочтите этот раздел перед началом работы, чтобы создать все необхо- димое для той конкретной среды разработки, для которой вы выполняете инсталля- цию. Позже вы сможете вернуться назад и скорректировать инсталляцию вручную. Использование инсталлятора Firebird Хотя существуют другие варианты, рекомендуемый способ инсталляции клиента — использование инсталляционной программы Firebird 1.5.
144 Часть И. Клиент-сервер Если вы используете инсталлятор, то первый выбор, который вы должны сделать — размещение корневого каталога для инсталляции клиента (рис. 7.1). Рекомендуется выбрать значение по умолчанию (C:\Program Files\Firebird\Firebird_l_5), тогда будет проще в будущем выполнять обновления. Тем не менее при необходимости вы може- те указать размещение на свой вкус. Хотя вы и не собираетесь инсталлировать сервер, инсталлятор предоставляет воз- можность устанавливать в корневой каталог дополнительные элементы, в том числе ключ системного реестра, который необходим некоторым программным продуктам, используемым на клиентской машине. Если вы инсталлируете инструменты команд- ной строки, то выбранное размещение корневого каталога является существенным. При необходимости, позже, вы сможете изменить установку вручную. ! Setup I irebird Database Server 1.5 ШяШ Select Destination Directory Where should Firebird Database Server 1.5 be installed? ,.i"i.xi Select the foldei wheeyou would tt« Firebird Database Server 1.5 to be irist Ad, then click Next. The program requires at least 1.4 MB of disk space. Рис. 7.1. Выбор размещения корневого каталога инсталляции Затем вы должны принять решение о выборе режима инсталляции — нужно ли уста- навливать клиента с инструментами командной строки или без них, как показано на рис. 7.2. Большинству клиентов эти инструменты не нужны; не рекомендуется инсталлиро- вать их на клиентской рабочей станции, если нет необходимости администратору получать доступ к серверу. Для минимальной инсталляции выберите вариант Mini- mum client install — no server, no tools (Минимальная установка клиента — без сер- вера, без инструментов) и щелкните по кнопке Next. Ваш выбор в следующем диалоговом окне (рис. 7.3) особенно важен, если на клиенте вы используете программное обеспечение сторонних организаций. Предыдущие инсталляторы устанавливали старую клиентскую библиотеку gds32.dll в системный каталог вместе с библиотекой времени выполнения для языка С msvcrt.dll, если она отсутствовала.
Гпава 7. Клиенты Firebird 145 Setup - Firebird Database Servfei 1.5 Select Components Which components should be installed? Select the components you want to install clear the components you do not want to install. Click Next when you are ready to con&iua Full installation of Super Server and development tools Full installation of Super Server and development tools. Full installation of Classic Server and development tools installation o^ Client tools for Developers and database administrators. Minimum clierit install - no server лта fools Custom installation Current selection requites at least 8.8 M0 of disk space. Рис. 7.2. Выбор инсталляции только клиента Setup Firebird Database Server 1Л Select Additional I asks Which additional tasks should be performed'? Select the addifenel tasks you would like Setup to perform while installing Firebird Database Server 1.S, then dick Next. (А)- (В)- Г~ Copy Fiebird client itay to ksysterrP directory? •p Generate client Ifcrary as GDS32.DLL for legacy app. support? < S ack | Next > Рис. 7.3. Выбор "версии" и размещения для клиента В версии 1.5 инсталлятор устанавливает все DLL — новую клиентскую библиотеку fbclient.dll и (если требуется) библиотеку времени выполнения для С и С++ msvcp60.dll — в каталог \bin в корневом каталоге Firebird. ♦ (A) Reallocation of the client library (Изменение размещения клиентской библио- теки). Если вам нужна совместимость с программным обеспечением, которое ожидает найти клиентскую библиотеку в системном каталоге, отметьте эту пози- цию. ♦ (В) Name of the client library (Имя клиентской библиотеки). Если вашему про- граммному обеспечению или компонентам нужна клиентская библиотека с име-
146 Часть II. Клиент-сервер нем gds32.dll, отметьте эту позицию. Инсталлятор сгенерирует специальную ко- пию fbclient.dll с именем gds32.dll и установит строку внутренней версии для со- вместимости с драйверами InterBase фирмы Borland и компонентами. Размещение этого файла зависит от состояния первой позиции (А). Щелкните по кнопке Next для инсталляции. Инсталляция клиента вручную Инсталляция клиента вручную требует выполнения всех тех же шагов, которые вы- полнял бы инсталлятор. Вам нужно скопировать следующие файлы из каталога ин- сталляции сервера на дискету или флэш-память: ♦ %system%\gds32.dll (C:\WINNT\system32 или C:\Windows) ♦ firebird.msg ♦ bin\fbclient.dll ♦ bin\msvcrt.dll (при необходимости) ♦ bin\msvcp60.dll (при необходимости) ♦ bin\instreg.exe ♦ bin\instclient.exe ♦ bin\fbclient. local ♦ bin\msvcrt. local ♦ bin\msvcp60. local На клиенте выполните следующие шаги: 1. Создайте корневой каталог Firebird и скопируйте туда firebird.msg. 2. В этом каталоге создайте каталог bin. 3. Скопируйте файлы из каталога \bin дискеты в этот новый каталог \bin. 4. Запустите программу instreg.exe из нового каталога \bin в окне командной строки. Очень важно запустить эту программу из каталога \bin корневого каталога Firebird, где расположена программа instreg.exe. Например, если корневой каталог Firebird находится в C:\Firebird_Client, введите: С:\Firebird_Client\bin> instreg.exe install 5. Если у вас есть приложение, которому нужна клиентская библиотека с именем gds32.dll, то вам необходимо выполнить программу instclient.exe. Инструкции в следующем разделе. Выполнение instclient.exe Программа instclient.exe может быть выполнена, когда вам требуется клиентская вер- сия, к которой осуществляют доступ существующие программы, драйверы или ком- поненты, которые ожидают, что имя клиентской библиотеки gds32.dll, или что она располагается по системному пути Windows. Это программа командной строки, ко- торая находится в каталоге \bin в корневом каталоге вашей инсталляции сервера
Гпава 7. Клиенты Firebird 147 Firebird. При необходимости скопируйте данный файл в соответствующий каталог на клиентскую машину. Инсталляция клиента в системный каталог Откройте окно командной строки и перейдите в каталог \bin. Синтаксис инсталляции клиента: instclient.exe {i[nstall]} [-fforce]] {fbclient | gds32} Требуются параметры i (или install) И один ИЗ параметров fbclient ИЛИ gds32. Если программа найдет, что файл, который вы пытаетесь инсталлировать (fbclient.dll или gds32.dll), уже находится в системном каталоге, она не будет выполняться. Что- бы программа записывала файл, даже если найдет его копию, используйте переклю- чатель -f (или -force). Ваша операционная система может потребовать перезагрузку машины для заверше- ния инсталляции. Д ВНИМАНИЕ! Если вы выбираете форсированную инсталляцию, вы рискуете разрушить клиента, который был инсталлирован для использования с другим программным обеспечением, которое было создано для соединения с сервером Firebird 1.0 или InterBase. Запрос к инсталлированному клиенту Программа instclient.exe может быть использована для получения информации о вы- полняющихся на этой машине клиентах Firebird 1.5. Синтаксис запроса о клиентах: instclient.exe {qfuery] fbclient I gds32} На рис. 7.4 показана возвращаемая информация. Iе' Command Prompt ” " " ...... " 1м C:\Progras» Files\Firebirds.Firebird_l_,5\bin>instclient-exe q installed GDS32.DLL version : 6.3.0.4306 (shared DLL count 4> C:\Progran Files\Firebird\Firehird„.l_5\bin>inst.client.exe q fbclient FBCLIENT.DLL was not found in the System directory. C:\Progran File s\Fire b ird\F ire b ird_l_5\h in > ----------21 Рис. 7.4. Запрос с помощью instclient.exe Использование instclient.exe для деинсталляции клиента версии 1.5 Для удаления клиента Firebird 1.5, инсталлированного в системный каталог, исполь- зуйте следующий синтаксис: instclient.exe {rfemove] fbclient I gds32}
148 Часть II. Клиент-сервер Список имен и размещение клиентской библиотеки В табл. 7.1 представлены имена клиентской библиотеки и размещение по умолчанию на клиентах Firebird. Таблица 7.1. Имена и размещение по умолчанию клиентов Firebird Версия, вид ОС клиента Библиотека Размещение по умолча- нию Подключается к Firebird 1,0.x Классический сервер Linux/UNIX libgds.so.O, символьная ссыл- ка на libgds.so /usr/lib Только Класси- ческий сервер 1.0 Firebird 1.0 Суперсервер для Windows Windows NT/2000 gds32.dll C:\WINNTt system32 Любой сервер 1.0 Windows ХР/Server 2003 gds32.dll C:\Windows\ system32 То же Windows 9x/ME gds32.dll C:\Windows То же Firebird 1.0 Суперсервер для Linux Linux/UNIX libgds.so.O, символьная ссыл- ка на libgds.so. Обратите внима- ние, что эта биб- лиотека отличает- ся от клиента libgds.so в Класси- ческом сервере /usr/lib Любой сервер 1.0 за исключе- нием Классиче- ского сервера Firebird 1.5 Классический сервер для Linux Linux/UNIX libfbembed.so.O или libfbclient.so.O, символьная ссыл- ка на libfbembed.so или libfbclient.so, 3 соответственно /usr/lib Только Класси- ческий сервер для Linux, при- ложения без потоков, воз- можны локаль- ные соединения Firebird 1.5 Суперсервер для Linux Linux/UNIX libfbclient.so.O, символьная ссыл- ка на libfbclient.so /usr/lib Любой сервер 1.5 3 Встроенный сервер для Linux не соответствует ему же в Windows. Как и в модели под Windows, клиент libfbembed.so имеет "прямое соединение" с экземпляром сервера. В Linux та же библиотека может создавать экземпляр встроенного сервера на сетевом сервере. Однако libfbembed.so строго рекомендуется в качестве клиента, если приложение содержит потоки.
Гпава 7. Клиенты Firebird 149 Таблица 7.1 (окончание) Версия, вид ОС клиента Библиотека Размещение по умолча- нию Подключается к Firebird 1.5 Клас- сический сервер и Суперсервер для Windows Windows NT/2000 Родной: fbclient.dll Firebird rootXbin Любой сервер 1.5 Совместимость: fbclient.dll или gds32.dll, встроен- ный в instclient.exe C:\WINNT\ system32 То же Windows ХР/Server 2003 Родной: fbclient.dll Совместимость: fbclient.dll или gds32.dll, встроен- ный в instclient.exe C:\Windows\ system32 Любой сервер 1.5 Windows Эх/МЕ Родной: fbclient.dll Firebird root\bin То же Совместимость: fbclient.dll или gds32.dll, встроен- ный в instclient.exe C:\Windows или C:WVindows\ system4 То же Firebird 1.5 Встроенный сервер Все встроенные клиенты Windows fbembed.dll Корневой ка- талог испол- няемого моду- ля приложения То же Пора дальше В части III мы переходим к детальному рассмотрению типов данных, поддерживае- мых языком SQL Firebird. В следующей главе вводятся типы данных и рассматрива- ются некоторые вопросы, которые вы должны понимать при подготовке к определе- нию, сохранению и работе с данными SQL. Она заканчивается специальным обсуж- дением, которое будет вам полезным, если вы собираетесь выполнять миграцию данных из существующей базы данных в Firebird. 4 Официальный инсталлятор и instclient.exe трактуют C:\Windows\system как "системный каталог" для этих платформ. Некоторые "неофициальные" инсталляторы следуют соглашени- ям, установленным фирмой Borland для InterBase, как и некоторые инсталляторы Firebird 1.0, трактующие C:\Windows как системный каталог. Оба размещения должны быть проверены, если вам нужно отыскать инсталлированного клиента.

ЧАСТЬ III Типы данных Firebird и домены Глава 8. О типах данных Firebird Глава 9. Числовые типы данных Глава 10. Типы даты и времени Глава 11. Символьные типы данных Глава 12. BLOB и массивы Глава 13. Домены

ГЛАВА 8 О типах данных Firebird Тип данных является основным атрибутом, который должен быть определен для каждого столбца в таблице Firebird. Он устанавливает и ограничивает характеристи- ки множества данных, которые могут храниться в столбце, и операции, которые мо- гут быть выполнены над данными. Он также определяет, какое дисковое пространст- во занимает каждый элемент данных. Выбор оптимального размера значений данных является важным решением для сетевого трафика, экономии дисковой памяти и раз- мера индексов. Firebird поддерживает большую часть типов данных SQL. В дополнение он поддер- живает динамически изменяемые типизированные и не типизированные большие двоичные объекты (Binary Large Object, BLOB) и многомерные однородные массивы для большинства типов данных. Где задаются типы данных Тип данных определяется для элементов данных в следующих ситуациях: ♦ при определении столбца в операторе create table; ♦ при создании шаблона глобально используемого столбца посредством create domain; ♦ при изменении шаблона глобально используемого столбца с применением alter domain; ♦ при добавлении нового столбца в таблицу или при изменении столбца с использо- ванием ALTER TABLE; ♦ при объявлении аргументов и локальных переменных в хранимых процедурах и триггерах; ♦ при объявлении аргументов и возвращаемых значений внешних функций (функ- ций, определенных пользователем, UDF). Поддерживаемые типы данных Числовые типы данных (обсуждаемые в главе 9) следующие: ♦ BIGINT, INTEGER И SMALLINT; ♦ NUMERIC и decimal; ♦ FLOAT И DOUBLE PRECISION.
154 Часть III. Типы данных Firebird и домены Типы данных даты и времени (обсуждаемые в главе 10): ♦ date; ♦ TIME И TIMESTAMP. Символьные типы данных (обсуждаемые далее в главе 11): ♦ character; ♦ VARYING CHARACTER И NATIONAL CHARACTER. Типы данных blob и массивы (обсуждаемые далее в главе 12): ♦ blob, типизированный и нетипизированный. ♦ ARRAY (маССИВ). Булевы типы данных Firebird 1.5 и выше не поддерживает булевы (логические) типы данных. Обычной практикой является объявление односимвольного или smallint домена для общего использования, где требуются булевы типы данных. Советы по определению булевых доменов см. в главе 13. "Диалекты" SQL Firebird поддерживает три "диалекта" SQL, которые не имеют другого практического назначения, кроме конвертирования баз данных из InterBase версий 5.x в Firebird. "Родной" диалект Firebird в настоящий момент известен как диалект 3. По умолча- нию Firebird создает новую базу данных в этом родном диалекте. Если в вашем опы- те в Firebird нет ни груза существующих предположений, ни созданных баз данных, которые вам нужно обновить для Firebird, вы можете без риска "следовать естеству" и игнорировать все последующие замечания и предупреждения относительно диа- лекта 1. Если вы бывший пользователь InterBase или применяли устаревшие инструменты для преобразования данных из других СУБД в InterBase, то диалекты SQL будут для вас предметом обсуждения в нескольких отношениях. Поскольку вы можете работать с этой книгой в том порядке, который вам подходит, то вопросы влияния диалекта SQL будут отмечены соответствующим образом. Неко- торые из наиболее серьезных эффектов разных диалектов проявляются в различии между типами данных. Вопросам диалектов посвящен разд. "Специальная тема ми- грации: диалекты SQL" этой главы. Идентификаторы с разделителями в SQL-92 В базах данных диалекта 3 Firebird поддерживает соглашение ANSI SQL о необяза- тельных идентификаторах с разделителями. Для использования зарезервированных слов, строк, чувствительных к регистру, или пробелов в именах объектов заключите
Гпава 8. О типах данных Firebird 155 имя в двойные кавычки. Это имя становится идентификатором с разделителями. К идентификаторам с разделителями всегда нужно обращаться, заключив их в ка- вычки. Подробности см. в разд. "Соглашения и ограничения в именовании объектов базы данных" главы 14. Более подробную информацию об именовании объектов базы дан- ных с использованием операторов create и declare см. в части IV этой книги. В при- ложении 11 представлен список ключевых слов, которые являются зарезервирован- ными словами в SQL. Контекстные переменные Firebird делает доступным множество значений переменных, поддерживаемых сис- темой в контексте текущего соединения клиента и его деятельности. Эти контекст- ные переменные доступны для использования в SQL, включая язык триггеров и хра- нимых процедур, PSQL. Некоторые доступны только в PSQL, большинство — только в диалекте 3 базы данных. В табл. 8.1 представлены контекстные переменные Firebird. Таблица 8.1. Список контекстных переменных Контекстная переменная Тип данных Описание Доступность CURRENT_CONNECTION INTEGER Системный идентификатор соединения, при котором выполняется настоящий за- прос Firebird 1.5 и вы- ше, DSQL и PSQL current_date DATE Текущая дата по часам на сервере Firebird 1.0 и вы- ше, все окружения SQL current_role VARCHAROl) Имя роли, под которым со- единился текущий пользова- тель. Возвращает пустую строку, если текущее соеди- нение не использовало роль Firebird 1.0 и вы- ше, все окружения SQL CURRENT_TIME TIME Текущее время по часам на сервере, выраженное в се- кундах после полуночи Firebird 1.0 и вы- ше, все окружения SQL CURRENT_T IME ST AMP TIMESTAMP Текущая дата и время по часам на сервере в секундах Firebird 1.0 и вы- ше, все окружения SQL CURRENT_TRANSACTION INTEGER Системный идентификатор транзакции, в контексте кото- рой выполняется текущий запрос Firebird 1.5 и вы- ше, DSQL и PSQL CURRENT_USER VARCHAR(128) Имя пользователя, который связан сданным экземпляром клиентской библиотеки Firebird 1.0 и вы- ше, все окружения SQL
156 Часть III. Типы данных Firebird и домены Таблица 8.1 (окончание) Контекстная переменная Тип данных Описание Доступность ROW_COUNT INTEGER Счетчик строк измененных, удаленных и добавленных оператором DML после за- вершения операции Firebird 1.5 и вы- ше, DSQL и PSQL UPDATING BOOLEAN Возвращает true, если вы- полняется оператор измене- ния Firebird 1.5 и вы- ше, только диа- лект триггера PSQL INSERTING BOOLEAN Возвращает true, если вы- полняется оператор добавле- ния Firebird 1.5 и вы- ше, только диа- лект триггера PSQL DELETING BOOLEAN Возвращает true, если вы- полняется оператор удаления Firebird 1.5 и вы- ше, только диа- лекгтриггера PSQL SQLCODE INTEGER Возвращает sqlcode из блока исключения when. Использо- вание см. в главе 32 Firebird 1.5 и вы- ше, только язык процедур PSQL GDSCODE INTEGER Возвращает gdscode из блока исключения when. Использо- вание см. в главе 32 Firebird 1.5 и вы- ше, только язык процедур PSQL USER VARCHAR(128) Имя пользователя, который связан сданным экземпляром клиентской библиотеки Предшественники InterBase, все версии Firebird, все окружения SQL, доступные в диалекте 1 Временные значения current_connection и current-transaction не имеют смысла вне текущего соединения и контекста транзакции соответственно. Сервер Firebird сохранит самые последние значения этих идентификаторов в заголовочной странице базы данных. После вос- становления базы данных из резервной копии эти значения будут заново установле- ны в ноль. current_timestamp записывает время сервера на момент старта операции. Для всех записей, вставляемых или обновляемых одним оператором, значение этой перемен- ной будет одним и тем же. Хотя otrrenT-Time хранится на сервере как время после полуночи, ее тип time, а не интервал времени. Для получения интервала времени используйте timestamp при
Глава 8. О типах данных Firebird 157 старте и завершении и вычтите время старта из времени завершения. Результатом будет интервал времени в днях. Контекстные переменные даты/времени основаны на времени сервера, которое мо- жет отличаться от внутреннего времени на клиенте. Примеры использования Следующий оператор возвращает время сервера в момент, когда сервер обслуживает запрос клиента Firebird: SELECT CURRENT-TIME AS TIME-FINISHED FROM RDB$DATABASE; В следующем операторе добавления идентификатор текущей транзакции, текущие серверные дата и время, а также имя пользователя системы будут записаны в таб- лицу: INSERT INTO TRANSACTIONLOG (TRANS_ID, USERNAME, DATESTAMP) VALUES ( CURRENT-TRANSACTION, CURRENT_USER, CURRENT-TIMESTAMP) ; Предопределенные литералы даты Литералы даты — заключенные в апострофы строки, которые Firebird SQL будет воспринимать как специальные даты. В диалекте 1 эти строки используются напря- мую, в диалекте 3 они должны быть преобразованы в соответствующий тип. В табл. 8.2 показано использование дат в каждом диалекте. Таблица 8.2. Список предопределенных литералов даты Литерал даты Подставляемая дата Тип данных, Диалект 1 Тип данных, Диалект 3 'NOW Текущая дата и время date (эквивалентно timestamp в диалекте 3) TIMESTAMP 'TODAY' Текущая дата date с нулевым временем date (только дата) 'YESTERDAY' Текущая дата -1 date с нулевым временем DATE ’TOMORROW1 Текущая дата + 1 date с нулевым временем DATE ХР ПРИМЕЧАНИЕ. В диалекте 1 тип данных date эквивалентен типу данных timestamp в диалекте 3. В диалекте 3 тип данных date содержит только дату. ,—R В диалекте 1 нет эквивалентного типа.
158 Часть III. Типы данных Firebird и домены Примеры использования предопределенных литералов даты В диалектах базы данных 1 и 3 литерал даты должен быть преобразован в тип данных timestamp: SELECT CAST ('NOW AS TIMESTAMP) AS TIME_FINISHED FROM RDB$DATABASE; Следующий оператор update устанавливает значение столбца даты в серверную дату плюс один день в диалекте 1: UPDATE TABLE_A SET UPDATE-DATE = 'TOMORROW' WHERE KEY_ID = 144; Вот та же самая операция в диалекте 3 с преобразованием типа: UPDATE TABLE_A SET UPDATE_DATE = CAST('TOMORROW' AS DATE) WHERE KEY-ID = 144; Столбцы Данные в таких реляционных системах баз данных, как Firebird, логически упорядо- чены в виде множества строк и столбцов. Столбец хранит один элемент данных с атрибутами, идентичными для всех строк в наборе. Определение столбца имеет два обязательных атрибута: идентификатор (или имя столбца) и тип данных. Другие ат- рибуты могут быть включены в определение столбца, например, character set и ог- раничения ТИПа NOT NULL И UNIQUE. Множества, определенные для хранения данных, называются таблицами. Структура строк таблицы определяется при объявлении идентификатора таблицы; эта структура является списком идентификаторов столбцов, их типов данных и других необходи- мых атрибутов. Простой пример объявления таблицы: CREATE table SIMPLE ( COLUMN1 INTEGER, COLUMN2 CHAR(3), COLUMNS DATE); Полное описание объявления таблиц и столбцов см. в главе 16. Домены В Firebird вы можете сделать предварительное объявление столбца с типом данных и "шаблонным набором" атрибутов в виде домена. Как только домен будет создан и
Гпава 8. О типах данных Firebird 159 подтвержден (commit), он может быть использован в любой таблице вашей базы дан- ных, как если бы он был типом данных. ЖГ ПРИМЕЧАНИЕ. Существуют некоторые ограничения по использованию доменов. В частности, домен не может применяться в объявлении локальных переменных, входных и выходных аргументов в модулях PSQL (язык процедур). Столбцы, основанные на домене, наследуют все атрибуты домена: его тип данных, другие атрибуты, включая значение по умолчанию, ограничения на значения, набор символов и порядок сортировки. Любой атрибут за исключением типа данных может быть переопределен при исполь- зовании домена в определении столбца при определении таблицы путем замены ат- рибута на другой совместимый атрибут или при добавлении атрибута. Например, можно объявить домен с набором атрибутов, не включающих not null, для которого можно сделать допустимым пустое значение в одних случаях, a not null в других. Более подробную информацию о создании, использовании и поддержке доменов см. в главе 13. Преобразование типов данных Обычно вы должны использовать совместимые типы данных при выполнении ариф- метических операций или при сравнении данных в условиях поиска. Если вам нужно выполнить операции над смешанными типами данных, или если ваш язык програм- мирования использует типы данных, которые не поддерживаются в Firebird, то необ- ходимо выполнить преобразование типов данных до выполнения операций с базой данных. Неявное преобразование типов Поведение диалектов 1 и 3 различно при неявном преобразовании типов. Это может стать проблемой, если вам нужно преобразовать существующую базу данных в диа- лект 3 и изменить использующие их приложения. ♦ В диалекте 1 для некоторых выражений Firebird выполняет автоматическое пре- образование данных в эквивалентные типы данных (неявное преобразование ти- пов). Здесь также может быть использована функция casto, хотя в большинстве случаев она не нужна. ♦ В диалекте 3 в условиях поиска требуется функция casto для явной трансляции одного типа данных в другой для операций сравнения. Например, сравнение столбца типа date или timestamp с '12/31/2003' в диалекте 1 при- водит к неявному преобразованию строкового литерала '12/31/2003' в тип данных DATE.
160 Часть III. Типы данных Firebird и домены SELECT * FROM TABLE_A WHERE START_DATE < '12/31/2003'; В диалекте 3 требуется явное преобразование: SELECT ♦ FROM TABLE_A WHERE START_DATE < CAST('12/31/2003' AS DATE); В выражениях, где смешиваются целые данные и числовые строки, в диалекте 1 строки неявно преобразуются в целое, если это возможно. В следующей операции: з + '1' диалект 1 автоматически преобразует символ "1" в smallint, в то время как диалект 3 вернет ошибку. Он требует явного преобразования типов: 3 + CAST('1' AS SMALLINT) Оба диалекта вернут ошибку в следующем операторе, потому что Firebird не может преобразовать символ "а" в целое: 3 + 'а' Явное преобразование типов: CASTO В тех случаях, когда Firebird не может выполнить неявное преобразование типов, вы должны выполнить явное преобразование типов посредством функции casto. Ис- пользуйте cast (; для преобразования одного типа данных в другой в операторе select обычно в предложении where для сравнения различных типов данных. Синтак- сис функции: CAST (значение I NULL AS тип данных) Вы можете использовать casto для сравнения столбцов с различными типами дан- ных в той же таблице или из различных таблиц. Например, вы можете преобразовы- вать правильно сформированную строку в типы дата/время, а также во множество числовых типов. Подробную информацию о преобразованиях типов данных смотри- те в остальных главах этой части. Изменение определения столбцов и доменов В обоих диалектах вы можете изменять тип данных доменов и столбцов в таблицах. Если вы выполняете миграцию базы данных из другой СУБД, это может быть полез- ным. Существуют некоторые ограничения при изменении типа данных. ♦ Firebird не допускает изменения типа данных столбца или домена, которое может привести к потере данных. Например, количество символов в столбце не может быть меньше наибольшего размера столбца. ♦ Преобразование числового типа данных в строковый требует минимального раз- мера строкового типа, как показано в табл. 8.3.
Глава 8. О типах данных Firebird 161 Таблица 8.3. Минимальное количество символов для числовых преобразований Тип данных Минимальная длина символьного типа BIGINT 19 (или 20 для чисел со знаком) DECIMAL 20 DOUBLE 22 FLOAT 13 INTEGER 10 (11 для чисел со знаком) NUMERIC 20 (или 21 для чисел со знаком) SMALLINT 6 Изменение типа данных столбца Используйте предложение alter column в операторе alter table, например: ALTER TABLE tablel ALTER COLUMN fieldl TYPE char(20); Информацию об изменении столбцов таблицы см. в разд. "Изменение таблиц" гла- вы 16. Изменение типа данных домена Используйте предложение type в операторе alter domain для изменения типа данных домена, например, ALTER DOMAIN MyDomain TYPE VARCHAR(40); На рис. 8.1 показаны допустимые преобразования типов данных. Более подробную информацию об изменении атрибутов домена см. в главе 13. Ключевые слова, используемые для спецификации типа данных Ключевые слова для спецификации типов данных в операторах DDL представлены здесь в качестве краткой справки. Точный синтаксис см. в соответствующей главе, связанной с типами данных этой части книги, а также в главах 13 и 16. {SMALLINT I INTEGER | FLOAT | DOUBLE PRECISION} [<array_dim>] | (DATE | TIME | TIMESTAMP} [<array_dim>] [{DECIMAL [NUMERIC} [ (precision [, scale])] [<array_diffl>] | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR} [(ant)] [<array_dim>] [CHARACTER SET charnaine] | (NCHAR | NATIONAL CHARACTER | NATIONAL CHAR} [VARYING] [(int)] [<array_dim>] 6 Зак. 420
162 Часть III. Типы данных Firebird и домены | BLOB [SUB__TYPE int | subtype_name] ] [SEGMENT SIZE int] [CHARACTER SET charname] I BLOB [(seglen [, subtype] ) ] Рис. 8.1. Допустимые преобразования данных с использованием операторов alter column и alter domain Специальная тема миграции: диалекты SQL Если вы бывшие пользователи InterBase или вы использовали устаревшие инстру- менты миграции для конвертирования других СУБД в InterBase, то диалекты SQL видимо будут влиять на некоторые аспекты новой жизни ваших баз данных и прило- жений при использовании сервера Firebird. ODS и диалект Структура данных на диске (On-Disk Structure, ODS) идентифицирует базу данных в отношении версии релиза сервера Firebird или InterBase, который создает и восста- навливает базу данных. ODS базы данных влияет на совместимость с версиями сер-
Глава 8. О типах данных Firebird 163 вера. Файл, подходящий для обновления ODS, может быть создан резервным копи- рованием базы данных (backup) с использованием утилиты gbak той версии, в кото- рой была создана база данных. Утилита должна быть использована с переключателем -ttransportable]. Когда файл резервной копии будет восстановлен с использованием gbak новой версии, восстановленная база данных будет иметь новую версию ODS. Такое невозможно выполнить для "понижения" ODS для любой базы данных. Использование gbak подробно обсуждается в главе 38. Обновление ODS не изменяет диалект Обновление ODS не влияет на диалект SQL базы данных: база данных диалекта 1 останется базой данных диалекта 1. Базы данных Firebird Firebird 1.0.x имеет ODS, обозначаемый как ODS-Ю. Firebird 1.5 имеет ODS-10.1. Чтобы преобразовать базу данных ODS-Ю, созданную в Firebird 1.0.x в ODS-10.1, вам просто нужно сделать ее резервную копию и восстановить эту копию с использо- ванием gbak из Firebird 1.5. По умолчанию серверы Firebird версий 1.0.3+ и 1.5 соз- дают базы данных диалекта 3. Для проверки ваших баз данных см. разд. "Как опре- делить диалект" далее в этой главе. Базы данных InterBase 6.0.x OpenSource InterBase версий 6.0.x имеют ODS-Ю. Тем не менее для обновления баз данных InterBase 6.0.x до любой версии Firebird рекомендуется использовать gbak из InterBase 6.0 с переключателем -ttransportable]. Файл резервной копии должен быть затем восстановлен с использованием gbak соответствующей версии сервера Firebird. Если база данных InterBase 6.0 была создана с установками по умолчанию, то, веро- ятно, она имеет диалект 1. См.разд. "Как определить диалект" далее в этой главе. Базы данных InterBase 5.x Базы данных InterBase 5 имеют ODS-9 (9.0 и 9.1). Серверы Firebird могут открывать их, читать как базы данных диалекта 1, но дальнейшая работа с этими базами данных в InterBase 5.x не рекомендуется. /Г ПРИМЕЧАНИЕ. Сервер Firebird не может создавать базы данных с ODS-9. Базы данных диалекта 1, созданные сервером Firebird, не могут быть использованы \__\ сервером InterBase 5.x. Не существует такой вещи, как база данных ODS-9 диалекта 1 или диалекта 3. Для обновления базы данных ODS-9 до Firebird используйте программу gbak из InterBase 5.x, запущенную с сервера InterBase 5.6 с переключателем -ttransportable]. Обновление базы данных InterBase 5.x до Firebird не преобразует ее в диалект 3 базы данных. Ее SQL диалект будет 1, и это обновление является необратимым.
164 Часть Hi. Типы данных Firebird и домены Где учитывается диалект Концепция диалекта различает способ поддержки типов данных и возможности язы- ка, доступные в базах данных с ODS-9 (диалект 1) и ODS-10 и выше (диалект 3). Сам сервер не имеет "диалекта" — диалект базы данных сохраняется как атрибут базы данных. Он является интерфейсом клиента, который определяет, какой набор воз- можностей запрашивается у базы данных. При некоторых условиях, если вы как раз- работчик приложений или пользователь инструментов администратора используете его неправильно, вы получите ошибочные данные, сохраняемые в базе, что может привести к некорректной работе приложений и базы данных. Здесь удобно обратиться к экземпляру клиентского соединения, выполненного с по- мощью библиотеки API или пользовательского драйвера языка, такого как JayBird (Java), ODBC или провайдер .NET, как "клиент диалекта 1" или "клиент диалекта 3". Это означает, что интерфейс клиента будет установлен для получения возможностей диалекта 1 или 3. Что можно отбросить Следующий список иллюстрирует некоторые отличия диалекта 1 от диалекта 3. ♦ Диалекты 1 и 3 хранят большие масштабируемые числа по-разному. В диалекте 3 все типы с фиксированной точкой (numeric и decimal), имеющие точность больше 10, являются 64-битовыми целыми с описанием, которое включает некоторые ат- рибуты для определения точности и масштаба. В диалекте 1 числа с фиксирован- ной точкой хранятся как 16- или 32-битовые целые, а числа с точностью, превы- шающей 10, преобразуются для хранения в 64-битовый тип числа с плавающей точкой double precision. Ваши данные, вероятно, вызовут ошибку переполнения, если клиент диалекта 3 выдаст запрос на сохранение числа в базе данных диалек- та 1, или сгенерируют ошибочный результат, когда клиент диалекта 1 выдаст за- прос на операции с числами в базе данных диалекта 3. ♦ Генераторы в диалекте 3 являются 64-битовыми целыми, в то время как в диалек- те 1 генераторы — 32-битовые целые. ♦ Арифметические операции в диалекте 3 были взяты из стандарта SQL-92, в то время как диалект 1 использует нестандартные правила. Например, деление цело- го на целое в диалекте 3 возвращает усеченное целое, в то время как в диалекте оно вернет число с плавающей точкой двойной точности. Если ваше приложение сохраняет результат выражения, включающего подобную арифметическую опе- рацию, "ошибочные" результаты будут сохранены без возбуждения исключения. ♦ Оба диалекта имеют тип данных даты и времени с именем date, но это разные типы. В диалекте 1 тип date эквивалентен типу timestamp диалекта 3, а в диалек- те 3 date является типом, хранящим только дату; этот тип не поддерживается в диалекте 1. ♦ Диалект 3 поддерживает тип time (время дня), который отсутствует в диалекте 1. ♦ В базах данных диалекта 3 Firebird поддерживает соглашения ANSI SQL по иден- тификаторам с разделителями, которые заключаются в двойные кавычки; такие
Гпава 8. О типах данных Firebird 165 идентификаторы не могут использоваться в диалекте 1. Несоответствие диалектов клиента и базы данных приведет к исключениям и некорректной работе. ♦ Диалект 3 имеет больше зарезервированных ключевых слов, чем диалект 1. Су- ществующие базы данных диалекта 1, которые используют новые ключевые слова в качестве идентификаторов, не будут работать с клиентом диалекта 3. ♦ Диалекты 1 и 3 ведут себя по-разному в случае неявного преобразования типов. Это может стать проблемой, если вы хотите конвертировать существующую базу данных в диалект 3 и изменять использующие ее приложения. Диалект 2 Не существует такого предмета, как "база данных диалекта 2". Диалект 2 является клиентской установкой, которую вы можете использовать для проверки переходных требований типов данных при конвертировании базы данных диалекта 1 в диалект 3. Inprise Corporation (теперь Borland) разработала документ "Migration Guide" (Руко- водство по миграции) для InterBase 6.0 в 2000 году, где подробно описаны действия по конвертированию баз данных диалекта 1 в диалект 3. Этот документ в формате PDF доступен на некоторых сайтах сообщества Firebird. Как определять диалект Вызовите окно командной строки и перейдите в каталог /bin, где находятся инстру- менты командной строки Firebird. Запустите утилиту isql. Соединитесь с вашей базой данных: SQL> CONNECT '/opt/firebird/examples/employee.fdb' CON> user 'SYSDBA' password 'icur2yy4m'; SQL> Затем введите следующую команду ISQL: SQL> SHOW SQL DIALECT; Client SQL dialect is set to: 3 and database dialect is: 3 (Диалект SQL клиента установлен в: 3, диалект базы данных: 3) Это хорошо. Если вы найдете несоответствие, это ничему не повредит, если вы не будете пытаться добавлять или изменять данные. Вы должны принять меры, чтобы гарантировать использование клиентом корректного диалекта. Изменение диалекта клиента в isql Предположим, что сейчас в isql вы хотите закрыть ваше соединение с текущей базой данных и соединиться с другой базой данных, о которой вы знаете, что она в диалек- те 1. Вот что вы делаете: SQL> COMMIT; SQL> SET SQL DIALECT 1; WARNING: client SQL dialect has been set to 1 when connecting to Database
166 Часть III. Типы данных Firebird и домены SQL dialect 3 database. (Предупреждение: SQL-диалект клиента установлен в 1 при соединении с базой данных с SQL-диалектом 3) SQL> Здесь все в порядке, потому что вы только собираетесь соединиться с базой данных диалекта 1: SQL> CONNECT 'RSERVER:D:\DATA\SAMPLE\legacy.gdb' CON> user 'SYSDBA' password 'icur2yy4m'; SQL> SHOW SQL DIALECT; Client SQL dialect is set to: 1 and database dialect is: 1 (Диалект SQL клиента установлен в: 1, диалект базы данных: 1) Множество свободно распространяемых и коммерческих инструментов администра- тора с графическим интерфейсом предоставляют возможность интерактивной уста- новки диалекта клиента. Компоненты доступа к базе данных и драйверы имеют свой- ства или другие механизмы для передачи диалекта структуре соединения API. Пора дальше Следующие четыре главы подробно описывают типы данных, поддерживаемые для каждой из основных категорий данных: числа, дата/время, символы и BLOB. Гла- ва 13, последняя глава в этой части, описывает реализацию доменов в Firebird для объединения типа данных с группой атрибутов в одно воспроизводимое определение.
ГЛАВА 9 Числовые типы данных Firebird поддерживает числовые типы данных с фиксированной точкой (точные чис- ла) и с плавающей точкой (приблизительная точность). Десятичными типами с фик- сированной точкой являются целые типы с нулевым масштабом smallint, integer и в диалекте 3 bigint, а также два почти одинаковых масштабируемых числовых типа: numeric и decimal. Два типа с плавающей точкой: float (низкая точность) и double PRECISION1. Firebird не поддерживает беззнаковый целочисленный тип. В табл. 9.1 показаны диапазоны значений каждого числового типа в Firebird. Таблица 9.1. Границы числовых типов Firebird Числовой тип Минимум Максимум SMALLINT -32,768 32,767 INTEGER -2,147,483,648 2,147,483,647 BIGINT _263 283 - 1 (Для мазохистов) -9223372036854775808 9223372036854775807 NUMERIC* Меняется Меняется DECIMAL* Меняется Меняется FLOAT Положительные 1.175x10‘38 3.402x1038 Отрицательные -3.402Х1038 DOUBLE PRECISION Положительные 2.225x10’308 1.797ХЮ308 Отрицательные -1.797x10308 * Границы для типов numeric и decimal изменяются в зависимости от способа хранения и масштаба. Границы всегда будут соответствовать тому типу, в котором эти данные будут сохраняться* 2. Точность задает количество значащих цифр (игнорируя конечные или начальные нули), которое может храниться в типе данных без переполнения или потери данных. 2 Хранимыми типами являются smallint, integer или bigint в зависимости от объявлен-
168 Часть III. Типы данных Firebird и домены Операции с числовыми типами ♦ Операции сравнения. Используйте стандартные операторы отношений (=, <, >, >=, <=, о или !=)3. Возможны сравнения строк с использованием таких операторов SQL, как containing, starting with и like. В данных операциях числа трактуются как строки. Более подробную информацию об этих операторах см. в главе 21. ♦ Арифметические операции. Могут быть использованы стандартные бинарные арифметические операторы (+, * и /). ♦ Операции преобразования. Firebird автоматически выполняет преобразования ме- жду числами с фиксированной точкой, с плавающей точкой и строковыми типами данных при выполнении операций над смешанными типами данных. Когда опе- рация является сравнением или арифметической операцией, включающей число- вые и нечисловые типы данных, то сначала данные преобразуются в числовой тип, а затем выполняется операция. ♦ Операции сортировки. По умолчанию запрос возвращает строки точно в том по- рядке, в котором находит их в таблице, т. е., скорее всего, неупорядоченные. Вы можете отсортировать строки по значениям целочисленных столбцов, используя предложение order by оператора select в убывающем или возрастающем порядке. Если числа сохраняются как символьные типы, то порядок сортировки будет ал- фавитно-цифровым, а не числовым, например, 1—10—11 ... 19—2. Целые типы Все целые типы являются точными знаковыми числами с нулевым масштабом. Firebird поддерживает три вида разной точности целых типов данных: ♦ smallint — является знаковым коротким целым с диапазоном от -32,768 до 32,767; ♦ integer — является знаковым длинным целым с диапазоном от-2 147 483 648 до 2 147 483 647; ♦ bigint — является знаковым 64-битовым целым с диапазоном от 2 63 до 263 - 1. Недоступен в диалекте 1. ПРИМЕЧАНИЕ. В Firebird 1.0.x в диалекте 3 объявляйте 64-битовые целые как numeric(18,0) или decimal (18,0). Всегда допустимо использование этого синтак- сиса для целых типов, при этом можно опускать второй аргумент (масштаб). 3 Использование "!=" в качестве замены для "<>" допустимо в Firebird, но не соответствует стандарту. Те, у кого хорошее экстрасенсорное восприятие, будут придерживаться "о", чтобы сделать код более удобным для чтения.
Глава 9. Числовые типы данных 169 Более подробную информацию о масштабе, точности и операциях, которые могут выполняться для чисел с фиксированной точкой, см. далее в разд. "Масштабируемые типы с фиксированной точкой". Следующие два оператора создают домен и столбец, соответственно, с типами дан- ных SMALLINT и integer: CREATE DOMAIN RGB_RED_VALUE AS SMALLINT; /“/ CREATE TABLE STUDENT_ROLL ( STUDENT_ID INTEGER, . . . ) ; Каждый из следующих операторов создает домен, который является 64-битовым це- лым: CREATE DOMAIN IDENTITY BIGINT CHECK (VALUE >=0); /* Firebird 1.5 и выше */ CREATE DOMAIN IDENTITY NUMERIC(18,0) CHECK (VALUE >=0); SMALLINT smallint является 2-байтовым целым, предоставляющим компактное хранение для целых чисел с ограниченным диапазоном значений. Например, smallint может быть подходящим для хранения значений цветов в форме RGB, как показано в предыду- щем примере создания домена. smallint часто используется для определения булевых значений, обычно 0 = ложь, 1 = истина. Пример такого использования можно найти в разд. "Объявление булевых доменов" главы 13. INTEGER integer является 4-байтовым целым. В диалекте 1 генераторы (см. разд. "Генерато- ры" этой глвавы) генерируют значения типа integer. Вы можете хранить такие целые в столбцах bigint без преобразования. BIGINT, NUMERIC(18,0) Доступны только в диалекте 3. Это 8-байтовое целое, полезное для хранения целых чисел с очень маленькими и очень большими значениями. В диалекте 3 генерируют- ся числа типа bigint (см. разд. "Генераторы"). /\ ВНИМАНИЕ! В диалекте 1 базы данных Firebird отвергает все попытки объявить ! \ домен или столбец как bigint. Сообщение об ошибке не будет выдано, если вы —“4- попытаетесь объявить домен или столбец как numeric(18,0), однако они будут молча объявлены как double precision. Поскольку точность является проблемой при использовании чисел с плавающей точкой, будьте внимательны и не допус- кайте неправильного использования numeric(18, о) в диалекте 1 базы данных для объявления столбца, который вы собираетесь использовать в качестве клю- ча для поиска или объединения.
170 Часть III. Типы данных Firebird и домены Автоинкремент или тип IDENTITY Firebird не поддерживает типы автоинкремента или identity, которые вы могли встретить в других системах управления базами данных. Что у него есть, так это средство числовых генераторов и возможность поддерживать независимые, имено- ванные серии чисел bigint. Каждая серия известна как генератор. Техника их ис- пользования для реализации и поддержки первичных ключей и других автоматиче- ских инкрементных серий описана в главе 31. Генераторы Генераторы являются идеальным средством для создания значений автоинкремент- ных уникальных ключей или серий значений числового столбца, а также других се- рий. Генераторы в базе данных объявляются оператором create, как и любой другой объект базы данных: CREATE GENERATOR AGenerator; Генераторам может быть присвоено любое начальное значение: SET GENERATOR AGenerator ТО 1; Д ВНИМАНИЕ! Существуют строгие предупреждения по поводу переустановки значений генераторов, когда эти значения находятся в использовании — см. разд. "Предупреждения о переустановке значений генераторов" в этой главе. Получение следующего значения Для получения следующего значения вызывайте функцию SQL geh_id(Имягенератора, п), где Имягенератора— имя генератора, а п— целое (диалект 1) или numeric(18,0) (диалект 3), определяющее значение шага. Запрос: SELECT GEN_ID(AGenerator, 2) from RDB$DATABASE; возвращает число, которое на 2 больше последнего сгенерированного числа, и уста- навливает значение генератора в сгенерированное значение. Текущее значение генератора Следующая строка: SELECT GEN_ID(AGenerator, 0) from RDB?DATABASE; возвращает текущее значение генератора без его увеличения4. 4 Часто таблица rdb$database используется для "пустых" запросов, которые возвращают одно вычисляемое значение или контекстную переменную. Это реальная системная таблица, содержащая одну и только одну строку. Она используется как dual в Oracle.
Гпава 9. Числовые типы данных 171 PSQL, язык программирования Firebird, позволяет напрямую присваивать сгенериро- ванное значение переменной: DECLARE VARIABLE MyVar BIGINT; MyVar = GEN_ID(AGenerator, 1); Более подробную информацию об использовании генераторов в модулях PSQL — в особенности в триггерах — см. в главе 29s. Использование отрицательного шага Аргумент шаг в gen id может быть отрицательным. Следовательно, можно устанав- ливать или переустанавливать текущее значение генератора, передавая отрицатель- ный аргумент или в виде целой константы, или в виде целого выражения. Эта воз- можность иногда используется как "трюк" для установки значений генератора в PSQL, поскольку в PSQL не могут использоваться такие команды DDL, как set GENERATOR. Например, оператор: SELECT GEN_ID (AGenerator, -GEN_JD (AGenerator, 0)) from RDB$DATABASE; устанавливает значение генератора в ноль. Предупреждения о переустановке значений генераторов Основное простое правило по переустановке значений генераторов в работающей базе данных — будь то в SQL, PSQL или в некотором интерфейсе администратора — не делать этого. Основное достоинство значений генератора то, что они гарантированно являются уникальными. В отличие от других доступных пользователю операций Firebird гене- раторы работают вне контекста транзакций. Однажды сгенерированное, число ус- тановлено и не может быть изменено отменой транзакции. Это дает полную уверен- ность в том, что ничто не может вмешиваться в целостность последовательности чи- сел, предоставляемых генератором. Оставьте переустановку значений генераторов в создаваемой базе данных для редких случаев, когда это требуется условиями проектирования. Например, некоторые бух- галтерские системы, написанные в старом стиле, передают журналы в таблицы исто- рии с новым первичным ключом, очищают таблицу журналов и устанавливают по- 5 Несмотря на то, что в третьем диалекте генераторы являются числами bigint, совершен- но необязательно столбец первичного ключа, для которого будет применяться генератор, так- же делать bigint. При выборе типа данных для столбца первичного ключа следует учитывать конкретные нужды предметной области. Как правило, в большинстве случаев вполне доста- точно INTEGER. — Прим. науч. ред.
172 Часть III. Типы данных Firebird и домены следовательность первичных ключей в ноль в организациях с несколькими филиала- ми, выделяя диапазоны значений ключа каждого филиала в отдельный "фрагмент", чтобы гарантировать целостность ключей при репликации. Никогда не переустанавливайте значения генератора в попытке скорректировать про- граммные ошибки, ошибки ввода данных или для "устранения промежутков" в по- следовательности значений6. Масштабируемые типы с фиксированной точкой Типы с фиксированной точкой позволяют управлять числами, которые должны вы- числяться с дробной частью, задающейся количеством цифр после десятичной точки, или масштабом. Обычно масштабируемые типы нужны для финансовых значений и других чисел, которые являются результатом подсчета или выполнения арифметиче- ских операций над целыми элементами и частями элементов. Предсказуемость результатов умножения и деления чисел с фиксированной точкой позволяет выбрать их для хранения денежных значений. Тем не менее, поскольку типы с фиксированной точкой имеют ограниченные "рамки", в которых могут раз- мещаться числа, они являются причиной появления исключений переполнения или потери значимости возле их верхней и нижней границы. В странах, где единицы ва- люты представляют небольшие значения, нужно быть внимательным при выборе ограничений чисел. Например, следующий оператор использует ставку налога (decimal(5,4)) и чистую прибыль (NUMERIC (18,2)): UPDATE ATABLE SET INCOME_AFTER_TAX = NET_PROFIT - (NET_PROFIT * TAX_RATE) ; Пусть ставка налога будет 0.3333. Пусть чистая прибыль будет 1234567890123456.78. Результат: ISC ERROR CODE:335544779 Integer overflow. The result of an integer operation caused the most significant bit of the result to carry. (Переполнение целого числа. Результат целочисленной операции привел к переносу большинства значащих битов) 6 Существуют техники для поддержки непрерывных последовательностей с использовани- ем генераторов, которые могут быть реализованы в случае абсолютной необходимости по- вторного применения неиспользуемых промежутков в сериях, не являющихся значениями ключа. Список Tech Info "Контролируемые серии чисел" (An Auditable Series of Numbers) опи- сывает подобную технику на http://www.ibobjects.com/TechInfo.html.
Гпава 9. Числовые типы данных 173 Firebird предоставляет два типа данных чисел с фиксированной точкой или масшта- бируемых: numeric и decimal. Каждый масштабируемый тип объявляется как type(p, s), где р определяет точность (количество значащих цифр), as — масштаб (размещение десятичной точки— т. е. количество цифр справа от символа десятич- ной точки). В соответствии со стандартом SQL-92 оба типа numeric и decimal ограничивают хра- нимое число объявленным масштабом. Различие между этими двумя типами заклю- чается в способе, каким ограничивается точность. Точность должна быть такой, "как объявлено" для столбцов типа numeric, в то время как столбцы decimal могут получать числа, чья точность ио меньшей мере равна тому, что было объявлено, больше гра- ницы реализации. Типы numeric и decimal, как они реализованы в Firebird, являются идентичными, за исключение случая, когда точность меньше пяти. Оба типа действительно соответ- ствуют стандарту типа decimal, numeric не соответствует SQL-92. Внутренне Firebird хранит масштабированное число как типы smallint (16 бит), integer (32 бита) или bigint (64 бита) в соответствии с объявленным размером точно- сти. Его объявленная точность7 8 сохраняется вместе с объявленным масштабом в виде отрицательного множителя масштаба3, представляющего степень числа 10. Когда к числу происходит обращение для вывода или для расчетов, оно получается произве- . п множитель масштаба ден^ем хранимого целого на 10 Например, для столбца, объявленного как numeric(4,3), Firebird сохраняет внутренне число в виде smallint. Если вы вводите число 7.2345, Firebird без сообщений округ- ляет самую правую цифру (4) и сохраняет 16-битовое целое 7235 и множитель мас- штаба-3. Это число будет найдено как 7.235 (7235 * 103). Тип данных NUMERIC Формат типа данных numeric: NUMERIC(p,s) Например, numeric (4,2) определяет число, состоящее не более чем из четырех цифр, включая две цифры справа от десятичной точки. Следовательно, числа 89.12 и 4.321 будут сохранены в столбце numeric<4,2) как 89.12 и 4.32 соответственно. Во втором примере последняя цифра Г3 выходит за пределы масштаба и просто отбрасывается. И все же возможно хранение в этом столбце числа с большей точностью, чем было объявлено. Максимально здесь может быть 327.67 — т. е. число с точностью 5. По- скольку база данных хранит фактическое число как smallint, числа не начинают вы- зывать ошибки переполнения, пока внутренне хранимое число не станет больше 32,767 или меньше -32,768. 7 Хранится в системной таблице rdb$fields как rdb$field_precision. 8 Хранится в системной таблице rdb$ fields как rdb$field_scale.
174 Часть III. Типы данных Firebird и домены Тип данных DECIMAL Формат типа данных decimal: DECIMAL(р,S) Как и в случае numeric, decimal(4,2) определяет число, состоящее, по меньшей мере, из четырех цифр, включая две цифры справа от десятичной точки. Тем не менее, по- скольку Firebird сохраняет данные decimal с точностью 4 и меньше как integer, этот тип может в столбце decimals,1) потенциально хранить число от 214 748 364.7 до -214 748 364.8 без появления ошибки переполнения. Точные числа могут быть перепутаны, не только по причине тонкой разницы между этими двумя типами, но и потому, что диалект базы данных влияет на доступный диапазон точности. Табл. 9.2 может служить руководством по тому, какую точность и масштаб вам нужно указать для различных требований к вашим числам. Таблица 9.2. Диапазон и способ хранения в Firebird типов данных numeric и decimal Точность Тип Диалект 1 Диалект 3 1—4 NUMERIC SMALLINT SMALLINT 1—4 DECIMAL INTEGER INTEGER 5—9 NUMERIC И DECIMAL INTEGER INTEGER 10—18 NUMERIC И DECIMAL BIGINT double precision* * Точные числа с точностью больше чем 9, могут быть объявлены в диалекте 1 базы данных без появ- ления исключения. Эти числа будут храниться как DOUBLE PRECISION и будут подчиняться тем же са- мым ограничениям точности, что и любые числа с плавающей точкой. В процессе преобразования ба- зы данных диалекта 1 в диалект 3 клиент диалекта 2, открыв таблицу, содержащую столбцы DECIMAL или NUMERIC с точностью, большей 9, получит сообщение об ошибке. Более подробную информацию о преобразованиях диалекта 1 в диалект 3 см. в разд. "Специальная тема миграции: диалекты SQL" главы 8. Конвертированные базы данных Если база данных диалекта 1 была обновлена до диалекта 3 с использованием созда- ния резервной копии gbak, а затем восстановлена, то числовые поля, определенные с точностью, большей 9, сохранят тип данных double precision. Хотя они будут пред- ставлены так, как были вначале определены (например, numeric (15,2)), они будут сохраняться и использоваться в вычислениях как double precision. Более подробную информацию о преобразованиях баз данных диалекта 1 в диалект 3 см. в разд. "Специальная тема миграции: диалекты SQL" главы 8. Специальные ограничения в статическом SQL Включающий язык встроенных приложений не может использовать или распознавать малые точности типов данных numeric или decimal с дробной частью, когда они внут- ренне хранятся как типы smallint или integer. Для устранения такой проблемы в лю-
Гпава 9. Числовые типы данных 175 бой базе данных, к которой предполагается доступ из таких встроенных приложений (ESQL): ♦ не определяйте столбцы или домены с типом numeric или decimal малой точности в базе данных диалекта 1. Или храните данные как целые и пишите в приложени- ях код, учитывающий масштаб, или используйте double precision и применяйте подходящий алгоритм округления для вычислений; ♦ в базе данных диалекта 3 определяйте столбцы или домены любого размера типа numeric и decimal, используя точность не меньше 10, чтобы получить их внутрен- нее хранение как bigint. Указывайте масштаб, если вы хотите управлять точ- ностью и масштабом. Используйте ограничения check, если вам нужно контроли- ровать диапазоны значений. Поведение типов с фиксированной точкой в операциях Деление При выполнении деления типов с фиксированной точкой диалекты 1 и 3 ведут себя по-разному. В диалекте 3, когда оба операнда являются типами с фиксированной точкой, Firebird суммирует масштабы обоих операндов для определения масштаба результата (част- ного). Частное имеет точность 18. При проектировании запросов с выражениями, содержащими деление, убедитесь, что частное всегда будет иметь точность больше, чем любой из операндов, и примите меры предосторожности в случаях, когда точ- ность потенциально может превысить допустимый максимум 18. В диалекте 1 деление всегда создает частное типа double precision. Примеры В диалекте 3 частное от деления decimal(12,3) на decimalo,2) будет decimal(18,5). Масштабы суммируются: SELECT 11223344.556/1234567.89 FROM RDB$DATABASE Это дает 9.09090. Посмотрим, чем отличается частное, когда этот же запрос выполняется в диалекте 1. Первый операнд трактуется как число double precision, потому что его точность (12) превышает максимум масштабируемого типа для диалекта 1. Частное также является числом double precision. Результат 9.09090917308727 по причине ошибок, присущих типам с плавающей точкой. Для следующей таблицы, определенной в диалекте 3, операции деления дают раз- личные результаты. CREATE TABLE tl ( il INTEGER, i2 INTEGER,
176 Часть III. Типы данных Firebird и домены nl NUMERIC(16, 2) , n2 NUMERIC(16,2)); COMMIT; INSERT INTO tl VALUES (1, 3, 1.00, 3.00); COMMIT; Следующий запрос возвращает значение 0.33 типа numeric(18,2), потому что сумма масштабов 0 (операнд 1) и 2 (операнд 2) равна 2: SELECT il/n2 from tl Следующий запрос возвращает значение 0.3333 типа numeric (18,4), потому что сум- ма масштабов двух операндов равна 4: SELECT п1/п2 FROM tl Деление целого на целое Используя предыдущий пример, следующий запрос в диалекте 3 вернет целое 0, по- тому что каждый операнд имеет масштаб 0, следовательно, сумма масштабов бу- дет 0: SELECT il/i2 FROM tl В диалекте 1, как и в большинстве других СУБД, деление одного целого на другое целое даст результат с плавающей точкой типа double precision: SELECT 1/3 AS RESULT FROM RDB$DATABASE Это дает .333333333333333. Хотя настоящее правило диалекта 1 является интуитивным для языков программиро- вания, оно не соответствует стандарту SQL-92. Целые типы имеют масштаб 0. Для согласованности это требует, чтобы результат (частное) любой операции деления целого на целое соответствовал правилам масштабирования для чисел с фиксирован- ной точкой и был бы целым. Диалект 3 соответствует стандарту и усекает частное от операций деления целого на целое до целого. Следовательно, следующий оператор является неразумным: SELECT 1/3 AS RESULT FROM RDB$DATABASE Он вернет 0. Если вам нужно сохранить дробную часть в результате (в частном) деления целого на целое в диалекте 3, убедитесь, что у одного из операндов присутствует нужный мас- штаб, или включите "множитель" в выражение, чтобы гарантировать масштаб ре- зультата. Примеры: SELECT 1.00/3 AS RESULT FROM RDB$DATABASE Вернет .33. SELECT (5 * 1.00)/2 AS RESULT FROM RDB$DATABASE Этот вернет 2.50.
Гпава 9. Числовые типы данных 177 Диалект 1 базы данных с диалектом 3 клиента База данных диалекта 1, которая была открыта клиентом диалекта 3, может препод- нести некоторые сюрпризы в отношении деления целых чисел. Когда операция вы- полняет нечто, что приводит к проверке условия check, или выполняется хранимая процедура или триггер, то осуществляемые действия основаны на диалекте, на кото- ром check, хранимая процедура или триггер были определены, а не на действующем диалекте, на котором приложение выполняет проверку, хранимую процедуру или триггер. Например, в базе данных диалекта 1 таблица содержит столбцы mycoli (integer) и mycol2 (integer) и следующее условие check, которое было определено, когда база данных имела диалект 1: CHECK(MYCOLI / MYCOL2 >0.5) Пусть теперь пользователь запускает isql или приложение, задав диалект 3. Програм- ма пытается добавить строку в конвертированную базу данных: INSERT INTO MYTABLE (COL1, COL2) VALUES (2,3); Поскольку ограничение check было определено в диалекте 1, оно вернет частное 0.666666666666667, и строка будет соответствовать условию check. Обратное также верно. Если то же ограничение check было добавлено в базу данных диалекта 1 из клиента диалекта 3, то для ограничения будет сохранена арифметика диалекта 3. Предыдущий оператор insert не будет выполнен, потому что проверка вернет значение частного 0, которое нарушает это ограничение. СОВЕТ. Мораль всего этого: используйте базы данных диалекта 3 и всегда со- Vj? единяйтесь с ними, применяя диалект 3. Если вы собираетесь использовать С* Firebird, то обновите все существующие базы данных до диалекта 3 — желатель- но описав новую базу данных и поместив в нее ваши старые данные — таким образом вы сохраните покой и сможете избежать уймы неприятных сюрпризов. Умножение и деление Если оба операнда являются точными числами, умножение операндов даст точное число с масштабом, равным сумме масштабов операндов. Например, CREATE TABLE tl ( nl NUMERIC(9,2), n2 NUMERIC (9,3) ) ; COMMIT; INSERT INTO tl VALUES (12.12, 123.123); COMMIT; Следующий запрос возвращает число 1492.25076, потому что nl имеет масштаб 2, а п2 — масштаб 3. Сумма масштабов 5. SELECT П1*п2 EROM tl
178 Часть III. Типы данных Firebird и домены В диалекте 3 точность результата умножения чисел с фиксированной точкой будет равна 18. Нужно принять меры предосторожности, чтобы быть уверенным, что не будет переполнения результата при распространении масштаба в умножении. В диалекте 1, если распространение масштаба приводит к тому, что вычисление даст результат с точностью больше 9, то результатом будет double precision. Сложение и вычитание Если все операнды являются точными числами, то сложение и вычитание операндов даст точное число с масштабом, равным максимальному масштабу операндов. Например, CREATE TABLE tl ( nl NUMERIC(9, 2) , n2 NUMERIC(9, 3)) ; COMMIT; INSERT INTO tl VALUES (12.12, 123.123); COMMIT; SELECT nl + n2 FROM tl; Этот запрос возвращает 135.243, выбирая максимальный масштаб операндов. Анало- гично, следующий запрос возвращает число -111.003: SELECT nl - n2 FROM tl; В диалекте 3 результат любого сложения или вычитания имеет тип numeric(18,п). В диалекте 1 он имеет тип numeric (9, п), где п — масштаб максимального операнда. Числовой ввод и показатели степени Любые числовые строки в DSQL, которые могут быть сохранены как decimal (18, S), вычисляются без потери точности, что могло бы произойти при промежуточном со- хранении в виде double. Синтаксический анализатор DSQL можно заставить распо- знавать числовые строки как числа с плавающей точкой при использовании научной нотации — если добавить символ "е" или "Е" перед показателем степени, который может быть нулевым. Например, DSQL распознает 16.92 как масштабируемое точное число и передаст его серверу в этой форме. С другой стороны, он будет трактовать 16.92Е0 как значение с плавающей точкой. Типы данных с плавающей точкой Типы данных с плавающей точкой служат "скользящими окнами" с точностью, под- ходящей масштабу числа. По своей природе в "плавающих" типах положение деся- тичной точки не зафиксировано — допустимо хранение в одном и том же столбце одного значения как 25.33333, а другого как 25.333. Эти значения различны и оба допустимы.
Гпава 9. Числовые типы данных 179 Определяйте столбцы с плавающей точкой, когда вам нужно хранить числа с изме- няющимся масштабом. Основное простое правило выбора типа с плавающей точкой вместо типа с фиксированной точкой: "используйте их для значений, которые вы из- меряете, а не которые вы считаете". Если столбец или переменная типа плавающей точки должны использоваться для хранения денежных величин, вам нужно быть внимательным к округлению и результатам вычислений. Числа с плавающей точкой могут быть использованы для представления значений, больших, чем это возможно для масштабируемых целых. Например, тип float может содержать числа с абсолютным значением не более 3.4Е38 (т. е. 34, за которым сле- дует 37 нулей) и не менее 1.1Е-38 (37 нулей, 11 и затем десятичная точка). Ширина диапазона достигается за счет потери точности. Число с плавающей точкой содержит приблизительное представление его значения с точностью до указанного количества цифр (его точности) в соответствии с текущим значением (масштабом). Оно не может содержать значение за пределами его диапазона. Значение с плавающей точкой несет больше информации, чем указанное количество цифр точности. Например, тип float имеет точность 7 цифр, но его реальная точ- ность 6 цифр. Последняя часть предоставляет дополнительную информацию о числе, такую как индикатор для округления и некоторые другие вещи, важные при выпол- нении арифметических операций с числом. Например, float может содержать число 1000000000 (1 000 000 000 или 109). "Кон- тейнер" float рассматривает данное число как 100000*Е4. (Это лишь иллюстрация — полное представление реализации чисел с плавающей точкой выходит за рамки на- стоящей книги и очень далеко от того, что узнал автор!). Если вы прибавите 1 к зна- чению float, то будет проигнорирована информация в седьмом разряде, потому что она не является значимой для текущего значения числа и его точности. Если же вы прибавляете 10 000 — число, которое значимо для хранимого в типе float числа, — то результатом может быть 100001 *Е4. Даже значения с подходящей точностью числа с плавающей точкой могут не всегда храниться в точном представлении. Такие значения, как 1.93 или даже 123, могут быть представлены в памяти как значения, очень близкие к указанному числу. Эти значения достаточно близки— когда число с плавающей точкой округляется для вывода, оно будет отображать ожидаемое значение, когда оно используется в вычис- лениях, результат будет очень близким приближением к ожидаемому результату. Эффект такой: когда вы выполняете какое-либо вычисление, которое должно дать результат 123, оно может быть очень близким приближением к 123. При точных сравнениях (равенство, больше чем, меньше чем и т. д.) между двумя числами с пла- вающей точкой, между числом с плавающей точкой и нулем или числом с плаваю- щей точкой и числом с фиксированной точкой не следует рассчитывать на ожидае- мые результаты. По этой причине не следует рассматривать использование столбцов с плавающей точкой в качестве ключей или применять к ним ограничения уникальности. Они не будут работать предсказуемо для отношений внешнего ключа или в объединениях. Для сравнений проверяйте значения с плавающей точкой в предложении between с подходящим диапазоном вместо того, чтобы выполнять точную проверку. Тот же
180 Часть III. Типы данных Firebird и домены совет применим и для сравнения с нулем — выберите подходящий диапазон значе- ний и запишите проверку данных между нулем и близким к нулю значением или ме- жду двумя подходящими значениями, близкими к нулю9. В базе данных диалекта 1 необходимость хранения значений числовых данных, имеющих больший диапазон, чем предоставляет 32-битовое целое, может быть ре- шена выбором типа double precision. Ограничения диалекта 1 также требуют исполь- зования чисел с плавающей точкой для всех действительных чисел, если к базе дан- ных предполагается доступ из встроенного приложения (ESQL). Firebird предоставляет два приближенных числовых типа данных с плавающей точкой (float и double precision), отличающиеся только размером точности. FLOAT float является 32-битовым типом данных с плавающей точкой с приблизительно 7 цифрами точности— для надежности предполагайте 6 цифр. Число с 10 цифрами 25.33333312, добавленное в столбец float, сохраняется как 25.33333. Диапазон чисел от -3.402 х 1038 до 3.402 х 1038. Наименьшее положительное число, которое может быть сохранено, 1.175 * 10 3S. DOUBLE PRECISION double precision является 64-битовым типом данных с плавающей точкой с прибли- зительно 15 цифрами точности. Диапазон от -1.797 х 1О308 до 1.797 х 1О308. Наи- меньшее положительное число, которое может быть сохранено, 2.225 х 1О'308. Арифметические операции над смешанными типами с фиксированной и плавающей точкой Когда бинарная операция (сложение, вычитание, умножение и деление) включает в качестве операндов точные числа и числа с плавающей точкой, то результат будет типа double precision. Следующий оператор создает столбец percent_change, используя тип double precision: CREATE TABLE SALARY_HI STORY ( PERCENT__CHANGE DOUBLE PRECISION DEFAULT 0 NOT NULL CHECK (PERCENT_CHANGE BETWEEN -50 AND 50), ) ; 9 Спасибо Джеффу Ворбойзу (Geoff Worboys) за его понятные замечания по этой больной теме.
Гпава 9. Числовые типы данных 181 Следующий оператор create table дает пример использования различных числовых типов данных: integer для общего количества заказов, с фиксированной точкой decimal для общей суммы продаж в долларах и float для скидки к продаже: CREATE TABLE SALES (. . QTY_ORDERED INTEGER DEFAULT 1 CHECK (QTY_ORDERED >= 1), TOTAL_VALUE DECIMAL (9,2) CHECK (TOTAL_VALUE >= 0), DISCOUNT FLOAT DEFAULT 0 CHECK (DISCOUNT >= 0 AND DISCOUNT <= D); Пора дальше В следующей главе мы рассмотрим типы данных для хранения и обработки дат и времени в Firebird.
ГЛАВА 1 О Типы даты и времени Firebird поддерживает в диалекте 3 типы данных date, time и timestamp. В диалекте 1 поддерживается только один тип данных, подобный timestamp, который, хотя и назы- вается date, не является взаимозаменяемым с типом date диалекта 3. DATE В диалекте 3 date хранит одну дату без времени — тип "только дата" — в виде 32-битового знакового целого. Хранимый диапазон дат от 1 января 0001 года до 31 декабря 9999 года1. В диалекте 1 тип date эквивалентен типу timestamp диалекта 3. Действительно, когда вы создаете новый столбец даты в базе данных диалекта 1 с использованием isql, по- является предупреждение, информирующее вас, что тип данных был переименован! SQLTYPE будет иметь ТИП ISC_TIMESTAMP. Не существует типа "только дата" в диалекте 1. Для сохранения в диалекте 1 только даты, передайте правильное значение даты и литерал времени в виде "00:00:00.0000". Литералы даты и времени обсуждаются более подробно в следующих разделах. СОВЕТ. Если вы используете isql для проверки дат диалекта 1, вы можете вклю- чать/выключать отображение времени при выводе даты, используя команду isql set time. По умолчанию вывод времени отключен. TIMESTAMP Тип данных timestamp диалекта 3 состоит из двух 32-битовых слов, хранящих дату и время. Данные хранятся как два 32-битовых целых, что эквивалентно типу date в диалекте 1. 1 Так в оригинале. В документации по InterBase указан диапазон дат от 1 января 100 г. до 29 февраля 32 768 г. — Прим, перев.
Глава 10. Типы даты и времени 183 Доли секунды Доли секунды, если хранятся, являются десятитысячными долями секунды для всех типов даты и времени. TIME В диалекте 3 time хранит время дня без даты: "только время". Для хранения исполь- зуется 32-битовое беззнаковое целое. Диапазон времени от 00:00 до 23:59:59.9999. В диалекте 1 нет эквивалента типу time. Если нужно сохранить время дня, выделите элементы часов, минут и секунд из данных date и преобразуйте в строку. Техниче- ские советы есть дальше в этой главе — обратитесь к разд. "Комбинирование EXTRACTQ с другими функциями". Интервал времени Ошибочно предполагать, что тип time может хранить интервал времени. Он не мо- жет. Для вычисления интервала времени вычтите более позднюю дату или время из более раннего. Результатом будет число numeric(18,9), выражающее интервал в днях. Поскольку точность теряется, доли секунд надо рассматривать как миллисекунды, а не десятитысячные доли секунд. Используйте обычные арифметические операции для конвертирования дней в часы, минуты или секунды, как вам требуется. Предположим, что столбцы started и finished имеют тип timestamp (date в диалек- те 1). Для вычисления и сохранения в столбце time_elapsed типа double precision ин- тервала времени в минутах вы можете использовать следующее2: UPDATE ATABLE SET TIME_ELAPSED = (FINISHED - STARTED) * 24 * 60 WHERE ((FINISHED IS NOT NULL) AND (STARTED IS NOT NULL)); Литералы даты Литералы даты являются "читаемыми человеком" строками, заключенными в апо- строфы. Их сервер Firebird распознает как константы даты или даты-и-времени для extract и других выражений, операций insert и update, а также в предложении where оператора select. Литералы даты используются, когда нужно передать константы даты: ♦ операторам select, update и delete в условия поиска предложения where; ♦ операторам insert и update для ввода констант даты и времени; ♦ аргументу from функции extract (). 2 Для того чтобы осуществлять агрегацию интервала (суммирование, среднее), необходимо хранить не время окончания интервала, а его длительность, например в секундах, в обычном целочисленном типе данных. — Прим. науч. ред.
184 Часть III. Типы данных Firebird и домены Распознаваемые форматы литералов даты и времени Количество форматов строк, распознаваемых как литералы даты, ограничено. Эти форматы используют шаблоны для подстановки элементов строк. Табл. 10.1 описы- вает используемые соглашения. Таблица 10.1. Элементы литералов даты Элемент Представление сс Столетие. Первые две цифры года (например, 20 для двадцать первого века) YY Год столетия. Firebird всегда сохраняет полное значение года, даже если год был введен без сегмента сс, при этом используется алгоритм "скользящего окна" для определения того, какое столетие сохранять ММ Месяц— целое в диапазоне от 1 до 12. В некоторых форматах требуется две цифры МММ Месяц — ОДИН ИЗ [JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, dec] . Также допустимы полные английские названия месяцев DD День месяца— целое в диапазоне от 1 до 31. В некоторых форматах требуется две цифры. Неверное значение дня для конкретного месяца вызывает ошибку НН Часы — целое в диапазоне от 00 до 23. Требуются две цифры NN Минуты — целое в диапазоне от 00 до 59. Требуются две цифры SS Полные секунды — целое в диапазоне от 00 до 59. Требуются две цифры nnnn Десятитысячные доли секунды в диапазоне от 0 до 9999. Значение по умолча- нию 0000. Если используется, то требуется четыре цифры Распознаваемые форматы описаны в табл. 10.2. Таблица 10.2. Распознаваемые форматы литералов даты и времени Формат Диалект 3 date Диалект 3 TIMESTAMP Диалект 1 DATE 'CCYY-MM-DD' ИЛИ 1YY-MM-DD1 Сохраняет только дату Сохраняет дату и время в виде 00:00:00 Сохраняет дату и время в.виде 00:00:00 ’MM/DD/CCYY1 ИЛИ ’MM/DD/YY1 То же То же То же ’DD.MM.CCYY' ИЛИ 'DD.MM.YY' То же То же То же 'DD-MMM-CCYY' ИЛИ 1DD-MMM-YY' То же То же То же 'DD,МММ,CCYY1 ИЛИ 'DD,MMM,YY' То же То же То же
Глава 10. Типы даты и времени 185 Таблица 10.2 (окончание) Формат Диалект 3 date Диалект 3 TIMESTAMP Диалект 1 DATE 'DD МММ CCYY' ИЛИ 1DD МММ YY' То же То же То же 1 DDMMMCC Y Y' ИЛИ 1 DDMMMYY' То же То же То же В элементе мим также допустимы полные английские названия месяцев, нечувствитель- ные к регистру. Правильные названия приведены в табл. 10.3 'CCYY-MM-DD HH:NN:SS.nnnn' или 'YY-MM-DD НН:NN:SS.nnnn' (элемент ".nnnn" необязателен) Сохраняет только дату; может по- требовать преоб- разования для даты. Время не сохраняется Сохраняет дату и время Сохраняет дату и время 'MM/DD/CCYYHH:NN:SS.nnnn1 ИЛИ 'MM/DD/YY НН:NN:SS.nnnn' То же То же То же 'DD.MM.CCYYHH:NN:SS.nnnn1 ИЛИ 'DD.MM.YY HH-.NN: SS .nnnn' То же То же То же 'DD-MMM-CCYY HH:NN:SS.nnnn' ИЛИ DD-MMMYY HH:NN:SS.nnnn' То же То же То же Типы timestamp в диалекте 3 и date в диалекте 1 принимают дату и время в литерале даты. Литерал даты без времени будет сохранен и с временем в виде ' оо: оо: оо'. Тип date в диалекте 3 принимает только дату. Тип данных time принимает только время. "Скользящее окно века" в Firebird Независимо от того, как представлена часть года в литерале date или timestamp, в ви- де ccyy или yy, Firebird всегда сохраняет полное значение года. Он обращается к ал- горитму получения части сс (столетие). Он также всегда включает столетие при по- иске типов даты. Клиентские приложения отвечают за отображение года в виде двух или четырех цифр. Для получения столетия Firebird использует алгоритм скользящего окна. Задача за- ключается в интерпретации двухсимвольного значения года как ближайшего к теку- щему году в интервале предшествующих и последующих 50 лет. Например, если текущий год 2004, то двухсимвольные значения года будут интер- претироваться, как показано в табл. 10.3.
186 Часть III. Типы данных Firebird и домены Таблица 10.3. Определение года по двухсимвольному виду, если текущим является 2004 год Двухсимвольный год Полученный год Рассчитывается как 98 1998 (2004 - 1998 = 6) < (2998 - 2004 = 94) 00 2000 (2004 - 2000 = 4) < (2100 - 2004 = 96) 45 2045 (2004 - 1945 = 55) > (2045 - 2004 = 41) 50 2050 (2004 - 1950 = 54) > (2050 - 2004 = 46) 54 1954 (2004 - 1954 = 50) = (2054 - 2004 = 50)* 55 1955 (2004 - 1955 = 49) < (2055 - 2004 = 51) * Кажущееся равенство в этом сравнении может ввести в заблуждение. 1954 год ближе к 2004, чем 2054, потому что все даты между 1954 и 1955 годами ближе к 2004, чем все даты между 2054 и 2055 годами. Разделители в неамериканских датах Ничто не вызывает больше затруднений для интернациональных пользователей, как ограничения в Firebird на использование наклонной черты (/) только для американ- ского формата 'mm/dd/ccyy'. Хотя почти все другие страны используют формат 1 dd/mm/ccyy ', Firebird будет либо записывать неправильную дату, либо вызовет ис- ключение для литерала даты, использующего соглашение 'dd/mm/ccyy1. Например, литерал даты 112/01/2004' всегда будет сохраняться в смысле "1 декабря 2004 года'1, а 14/01/2004 ’ вызовет исключение выхода за границы диапазона, потому что не существует месяца 14. Однако допускается ’ccyy/mm/dd’: дата '2004/12/31' будет расшифровано как "31 декабря 2004 года". Обратите внимание, что Firebird не учитывает локальные форматы даты Windows или Linux при интерпретации литералов даты (ни на сервере, ни на клиенте). Его интер- претация числовых форматов дат основывается на символе-разделителе. Если точка (.) используется в качестве разделителя, Firebird интерпретирует дату в виде неаме- риканской нотации dd.mm, в то время как любой другой разделитель предполагает американскую нотацию mm/dd. Чтобы убрать американскую интерпретацию даты, ваши приложения должны преобразовать введенную дату dd/mm/ccyy в литерал, где наклонная черта заменена на символ точки в качестве разделителя. Дата 'dd.mm.ccyy' правильная. Могут быть использованы и другие форматы литералов даты. Пробелы в литералах даты Пробелы или символы табуляции могут присутствовать между элементами. Дата должна быть отделена от времени, по меньшей мере, одним пробелом. Заключение в апострофы литералов даты Литералы даты должны быть заключены в апострофы (ASCII 39). Допустимы только апострофы, а не двойные кавычки.
Глава 10. Типы даты и времени 187 Литералы месяца В табл. 10.4 показаны литералы месяцев. Таблица 10.4. Литералы месяцев и правильное английское написание Число Аббревиатура (не чувствительно к регистру) Полное название месяца (не чувствительно к регистру) 01 JAN January 02 FEB February 03 MAR March 04 APR April 05 MAY May 06 JUN June 07 JUL July 08 AUG August 09 SEP September 10 OCT October 11 NOV November 12 DEC December Примеры литералов даты Двадцать пятое число (25) шестого месяца (июнь) 2004 года может быть представле- но любым из следующих способов: '25.6.2004' '06/25/2004' 'June 25, 2004' '25.jun.2004' '6,25,2004' '25,jun,2004' '25jun2004' '6-25-04' 'Jun 25 09' '25 jun 2004' '2004 June 25' '20040625' ' 25-jun-2004' '2004-jun-25' '20040625' '25 JUN 04’ '2004-06-25' '2004,25,06' Предварительно определенные литералы даты Firebird поддерживает группу "предопределенных" литералов дат — английские сло- ва, заключенные в апострофы, которые Firebird выбирает или вычисляет и интерпре- тирует в контексте соответствующего типа даты/времени. Слова 'today', 'now, 'yesterday' и 'TCMORRROW интерпретируются, как показано в табл. 10.5.
188 Часть III. Типы данных Firebird и домены Таблица 10.5. Предварительно определенные литералы даты Литерал Тип диалекта 3 Тип диалекта 1 Значение 'NOW TIMESTAMP DATE Дата и время сервера, которые были текущими на момент старта операции DML. 'NOW будет преоб- разовано и корректно сохранено в ПОЛЯХ DATE, TIME И TIMESTAMP В диалекте 3 или в полях date в диа- лекте 1. Как и эквивалентная кон- текстная переменная currenT-Timestamp, значение все- гда сохраняется с долями секунды ' .0000' * ' TODAY' DATE date хранится с временем равным '00:00:00' Дата и время сервера, которые были текущими на момент старта операции. Если в процессе опера- ции миновала полночь, дата не изменяется. Эквивалентен контек- стной переменной диалекта 3 CURRENT_DATE. Недопустим для полей типа time 'TOMORRROW DATE date хранится с временем равным '00:00:00' Дата и время сервера, которые были текущими на момент старта операции, плюс 1 день. Если в процессе операции миновала пол- ночь, дата, из которой была вычис- лена дата 'TOMORRROW, не изме- няется. Недопустим для полей типа time 'YESTERDAY' DATE DATE хранится с временем равным '00:00:00' Дата и время сервера, которые были текущими на момент старта операции, минус 1 день. Если в процессе операции миновала пол- ночь, дата, из которой была вычис- лена дата 'yesterday', не изме- няется. Недопустим для полей типа time * Тем не менее ничто не теряется. Вы можете получить дату и время сервера с десятитысячными до- лями секунды, используя UDF GetExactTimestamp (...) из библиотеки UDF Firebird. Более подроб- ную информацию см. в приложении 1. Неявное преобразование типов в литералах даты и времени Когда литералы даты — неважно, обычные или предварительно определенные — используются в SQL в контексте с соответствующим типом даты/времени столбца или переменной, синтаксический анализатор SQL может корректно их интерпретиро- вать без преобразования. При этом в небольшом количестве случаев, когда не суще-
Глава 10. Типы даты и времени 189 ствует типизированного значения, которому синтаксический анализатор мог бы при- своить литерал даты, он трактует любой литерал даты как строку. Например, совершенно верным является затребовать, чтобы запрос select вернул константу, которая не связана ни с каким столбцом в базе данных. Основное "хакер- ство" в Firebird— использование системной таблицы rdb$database в запросе, по- скольку эта таблица имеет одну и только одну строку, и всегда можно получить ска- лярное значение: единственное контекстное значение от сервера. Следующие два примера иллюстрируют типичное использование этого приема: SELECT 'NOW' FROM RDB$DATABASE; Так как запрос возвращает константу, а не значение столбца, ее тип данных интер- претируется как char(3), 'now. Этот пример SELECT '2.09.2004' FROM RDBSDATABASE; вернет CHAR(9), '2.09.2004'. Чтобы получить от синтаксического анализатора правильную интерпретацию лите- рала даты при условии, что анализатор не может определить тип данных, используй- те функцию cast(): ♦ для диалекта 3: SELECT CAST('NOW' AS TIMESTAMP) FROM RDB$DATABASE; SELECT CAST('2.09.2004' AS TIMESTAMP) FROM RDB$DATABASE; ♦ для диалекта 1: SELECT CAST ('NOW AS DATE) FROM RDBSDATABASE; SELECT CAST('2.09.2004' AS DATE) FROM RDB$DATABASE; Контекстные переменные даты и времени Контекстные переменные даты и времени current_date, current_time и current timestamp возвращают значение даты и времени, полученные с сервера на момент начала выполнения оператора SQL, содержащего контекстную переменную. Табл. 10.6 описывает эти переменные. Таблица 10.6. Контекстные переменные даты и времени Переменная Тип диалекта 3 Тип диалекта 1 Значение CURRENT_T IME STAMP TIMESTAMP DATE Текущая дата и время, округ- ленное до секунд. Дробная часть секунд всегда возвра- щается равной '.0000' current_date DATE He поддерживается Текущая дата current_time TIME He поддерживается Текущее время, выраженное в часах, минутах и секундах после полуночи. Дробная часть секунд всегда возвра- щается равной ’ .0000'
190 Часть III. Типы данных Firebird и домены Операции, использующие значения даты и времени Использование арифметических операций в манипулировании данными, в вычисле- ниях и в отношениях между двумя датами были ранее рассмотрены в разд. "Интер- вал времени" этой главы. Возможность вычитания значения более ранней даты, вре- мени или даты-времени из более поздней существует благодаря способу хранения типов дата и время в Firebird. Способ хранения использует одно или два 32-битовых целых для даты/времени, только для даты или только для времени дня. Данные, представленные в этих числах, являются днями в длинном слове даты и дробной частью дней в слове времени. Дата представлена количеством дней с "нулевой да- ты”— 17 ноября 1898 г3. Время представлено в десятитысячных долях секунд, про- шедших с полуночи. В диалекте 3 date хранит только дату. В диалекте 3 time хранит только время. timestamp и в диалекте 1 date хранят обе части. С этими числовыми структурами можно довольно просто оперировать, используя несложные выражения сложения и вычитания для вычисления разницы во времени (интервал), увеличения или уменьшения дат, установления диапазонов даты или вре- мени. В табл. 10.7 описываются доступные операции и получаемые результаты. Таблица 10.7. Арифметические операции для типов данных даты и времени Операнд 1 Оператор Операнд 2 Результат DATE + TIME timestamp (арифметическая конкатена- ция) DATE + Числовое значение n** date, увеличенная на п целых дней (игнорируется дробная часть п, если указана) TIME + DATE timestamp (арифметическая конкатена- ция) TIME + Числовое значение n** time, увеличенное на п секунд* TIMESTAMP + Числовое значение n** timestamp, где дни увеличены на целую часть числа п плюс дробная часть числа п (если указана) как количество десяти- тысячных долей секунды в дне (8.64 х 10s) DATE - DATE Количество дней в интервале: DECIMALO, 0) DATE - Числовое значение n** date, уменьшенная на пдней (игнори- руется дробная часть п, если указана) 3 Вероятно, не будет ошибкой, если эта дата дает целое значение, называемое Измененным юлианским номером дня. Подробности см. на http://hermetic.nofadz.com/cal_stud/jdn.htm.
Глава 10. Типы даты и времени 191 Таблица 10.7 (окончание) Операнд 1 Оператор Операнд 2 Результат TIME - TIME Количество секунд в интервале: DECIMAL(9,4) TIME - Числовое значение п“ time, уменьшенное на п секунд* TIMESTAMP - TIMESTAMP Количество дней и части дня в интерва- ле: DECIMAL (18, 9) TIMESTAMP — Числовое значение п‘* timestamp, где дни уменьшены на це- лую часть числа п плюс дробная часть числа п (если указана) как количество десятитысячных долей секунды в дне (8.64x10s) * При необходимости повторяется (result=modulo(result, (24*60*60))) пока не будет выделена результирующая часть дней. ** В диалекте 3 для типа date п является целым, представляющим количество дней. Для типов данных timestamp и для диалекта 1 date п может быть числом, представляющим количество дней слева от десятичной точки (целая часть) и части дня справа от десятичной точки (дробная часть). Для типа time п является целым числом, представляющим количество секунд. Общие правила для операций Одно значение даты или времени может быть вычтено из другого, если: ♦ оба значения имеют один и mom же тип даты/времени; ♦ первый операнд является более поздним, чем второй. Вычитание, использующее типы дата/время, дает результаты: масштабируемое decimal в диалекте 3 и double precision в диалекте 1. Типы данных дата/время не могут складываться друг с другом. Однако можно вы- полнить конкатенацию части даты и части времени, используя: ♦ дополнительный бинарный синтаксис для конкатенации пар полей или перемен- ных; ♦ объединение строк для конкатенации литерала дата/время с другим литералом дата/время или с полем, или переменной типа дата/время. Операции умножения и деления, включающие типы данных дата/время, недопус- тимы. Выражения в качестве операндов Операндом при увеличении или уменьшении значения timestamp, time, date или date в диалекте 1 может быть константа или выражение. Выражение может быть особенно полезным в ваших приложениях, когда вам надо увеличить или уменьшить значение в секундах, минутах, часах или, например, требуется половина дня, а не целое коли- чество дней.
192 Часть III. Типы данных Firebird и домены Диалект 3 использует правило SQL-92 для деления целого на целое: результатом все- гда будет целое, округленное при необходимости в меньшую сторону. При использо- вании выражений в диалекте 3 убедитесь, что один из операндов является действи- тельным числом с достаточным количеством десятичных знаков, чтобы избежать возможной арифметической ошибки или потери точности результата при выполне- нии целочисленного деления SQL-92. В табл. 10.8 показаны некоторые примеры. Таблица 10.8. Примеры использования выражений в качестве операндов Вводимый операнд п Сложение или вычитание Альтернатива В секундах п/86400.0 (п*1.0)/(60*60*24) В минутах п/1440.0 (п*1.0)/(60*24) В часах п/24.0 Зависит от желаемого результата. Например, если п=3, а делитель для половины дня — 2, результат будет 1, а не 1.5 Половина дня п/2 То же Поскольку годы, месяцы, кварталы не являются константами, нужны более сложные алгоритмы для их использования в операциях даты/времени. Возможно, вам следует для этих целей посмотреть функции, определенные пользователем (UDF), которые вы сможете использовать в качестве выражений в операндах. Использование CAST() с типами дата/время В некоторых местах этой главы вы встречали функцию casto в выражениях, содер- жащих типы данных даты и литералы даты. В настоящем разделе рассматриваются различные аспекты преобразования даты и времени более широко и подробно. Преобразование между типами дата/время Обычно преобразование из одного типа дата/время в другой возможно, если исход- ный тип дата/время содержит подходящий вид данных для помещения в выходной тип дата/время. Например, timestamp содержит данные, которые можно преобразо- вать в тип только даты date или только время time, в то время как тип time не содер- жит достаточно данных для преобразования в тип date. Firebird предоставляет воз- можность преобразовывать тип date в timestamp, присваивая времени значение пол- ночи, и тип time в timestamp, выбирая дату из контекстной переменной current_date (серверное время). В табл. 10.9 представлены правила преобразования.
Глава 10. Типы даты и времени 193 Таблица 10.9. Преобразования между типами дата/время в диалекте 3 Исходный тип В ТИП TIMESTAMP В ТИП DATE В тип time TIMESTAMP Недоступно Да, преобразует дату, игнорируя вре- мя Да, преобразует время, игнорируя дату DATE Да, время устанавливается в значение полночи Недоступно Нет TIME Да, дате присваивается значение current__date Нет Недоступно DATE + TIME Да, CAST ( (DATEFIELD + TIMEFIELD AS TIMESTAMP) Нет Нет Преобразование типов даты в CHAR(n)v\ VARCHAR(n) Используйте в операторах SQL-функцию casto для трансляции данных даты и вре- мени в символьные типы данных. Firebird преобразует типы дата и время в форматированные строки, в которых дата (если присутствует) представлена в установленном формате — в зависимости от диа- лекта— а время представлено в стандартном для Firebird формате: нн:мм:зз.пппп. Необходимо использовать столбец, переменную типа char или varchar подходящего размера для получения желаемого вами результата. Преобразование типов дата/время можно выполнять в оба строковых типа фиксиро- ванной длины char и переменной длины varchar. Поскольку размер преобразуемой строки заранее известен, char имеет небольшое преимущество перед varchar: исполь- зование char при передаче по сети сэкономит вам два байта, которые добавляются к varchar для хранения размера. "Правильный размер" зависит от диалекта, обратите на это внимание, varchar может быть более подходящим при использовании в коде при- ложения, которое может обрабатывать оба диалекта. Если символьное поле слишком мало для результата, то появится исключение пере- полнения. Пусть, вам нужно получить строку, содержащую только дату из timestamp. Использование для этого символьного контейнера меньшего размера не будет рабо- тать — cast () не обрезает выходную строку. Необходимо выполнить двойное преоб- разование: вначале преобразование timestamp в date, а затем преобразование даты в символьный тип корректного размера — см. примеры в следующем разделе. Диалект 3 Преобразование date или timestamp создает дату в формате ISO (ccyy-mm-dd). Полная длина выходной строки 10 символов для date и 11 — для timestamp (дата и один про- бел перед временем). Нужно 13 символов для time или для времени в timestamp. 7 Зак. 420
194 Часть III. Типы данных Firebird и домены Например, выражение SELECT CAST(timestamp_col as CHAR(24)) AS TstampTxt FROM RDB$DATABASE; даст строку вроде следующей: 2004-06-25 12:15:45.2345 Это выдаст исключение переполнения: SELECT CAST(timestamp^col as CHAR(20)) AS TstampTxt FROM RDB$DATABASE; Двойное преобразование создает правильную строку: SELECT FIRST 1 CAST ( CAST (timestamp_col AS DATE) AS CHAR(10)) FROM tablei; Результатом будет: 2004-06-25 К сожалению, нет возможности путем прямого преобразования получить строку, со- держащую дату плюс время без дробных долей секунды. Это может быть выполнено с использованием сложного выражения, включающего функции casto и extracto. Пример см. в одном из следующих подразделов разд. "Функция EXTRACT()". Диалект 1 Дата в типе данных date диалекта 1 преобразуется в формат dd-mmm-ccyy, а не в фор- мат ISO, как в диалекте 3. Например, вот это SELECT CAST(dldate_col as CHAR(25)) AS DateTimeTxt FROM RDB$DATABASE; даст 26-JUN-2004 12:15:45.2345 Следовательно, преобразование дат в диалекте 1 требует 11 символов вместо 10 плюс 1 символ пробела плюс 13 для времени — всего 25. Более сложные выражения Преобразование может использовать более сложные выражения в комбинации с дру- гими выражениями, например: SELECT CAST (10 + CAST(('TODAY') AS DATE) AS CHAR(25)) TEXTTIME FROM RDB$DATABASE; ИЛИ SELECT CAST (10 + CURRENT_TIMESTAMP) AS DATE) AS CHAR(25)) TEXTTIME FROM RDBSDATABASE; возвращает текстовую строку, показывающую дату на 10 дней позже текущей даты.
Глава 10. Типы даты и времени 195 Преобразования между типами дата/время и другими типами данных Любой символьный тип или выражение, чье содержание может быть выражено в правильном литерале даты, может быть преобразовано в соответствующий тип дата/время. Типы данных времени и даты не могут быть участниками преобразований в типы или из ТИПОВ SMALLINT, INTEGER, FLOAT, DOUBLE PRECISION, NUMERIC, DECIMAL ИЛИ BLOB. Использование преобразований Обмен данными дата/время с другими приложениями Импорт данных дата/время, созданных в другом месте, — например, в другой систе- ме базы данных, во включающем языке или в устройстве получения даты — обычно требует некоторых предварительных действий, прежде чем данные дата/время могут быть помещены в базу данных Firebird. Большинство включающих языков программирования не поддерживают типы дан- ных date, time и timestamp, представляя их внутренне в виде строк или структур. Уст- ройства ввода данных обычно сохраняют дату и время в строках различных форма- тов и стилях. Типы дата/время чаще всего являются несовместимыми в различных базах данных. Преобразование обычно требует вычисления и декодирования содержимого элемен- тов даты в исходных данных. Второй частью процесса является реконструкция деко- дированных элементов и передача их SQL Firebird каким-нибудь способом. Во вклю- чающем языке, в котором не существует никакого способа передачи типов данных дата/время Firebird, использование функции casto в комбинации с допустимыми текстовыми строками для обработки в Firebird в качестве литералов даты может ока- заться очень полезным4. В некоторых случаях сохранение внешних данных в текстовых файлах в форматках литералов даты может быть лучшим решением. Firebird может открывать такие фай- лы, как входные таблицы в модулях на серверной стороне — хранимые процедуры или триггеры — и использовать cast () и другие функции для обработки данных в столбцах даты/времени в родных таблицах. Более подробную информацию см. в разд. "Использование внешних файлов в качестве таблицы " главы 16. Функция cast () также может быть использована для подготовки внутренних данных для экспорта. 4 API предоставляет программистам две полезные функции для преобразования структуры дата/время клиентского языка в формат Firebird и из формата Firebird. См. в документе фирмы Borland "API Guide" (Руководство по API) описание функций isc_encode_date() и isc_decode_date ().
196 Часть III. Типы данных Firebird и домены Использование в выражениях условия поиска Такие ситуации появляются, когда использование casto в предложении where с ти- пами дата/время решает логические проблемы сравнения столбца одного типа со столбцом другого типа данных. Предположим, что нам нужно объединить таблицу покупателей, которая содержит столбец balance_date типа date с таблицей транзакций покупателя, которая имеет столбец transudate типа timestamp. Нам нужно создать предложение where, которое выбирает набор данных, содержащий неоплаченные транзакции для текущего поку- пателя, появившиеся не позднее balance^date. Мы можем попытаться: SELECT... WHERE CUST_TRANS. TRANSDATE <= CUSTOMER.BALANCE_DATE; Этот критерий не даст нам того, что мы хотим! Он найдет все строки транзакций по- сле полуночи даты balance_date, потому что он вычислит balance_date с временем 00:00:00. Любая транзакция после полуночи этой даты не будет соответствовать кри- терию поиска. Что мы действительно хотим, так это включить все транзакции, где дата из trans date соответствует balance_date. Преобразование transudate в тип date сохраняет день: SELECT.. . WHERE CAST (CUSTJTRANS.TRANSDATE AS DATE) <= CUSTOMER. BALANCEJDATE; Использование в преобразовании диалекта Диалект 3 предоставляет более богатую поддержку типов дата/время, чем диалект 1. Одной из задач, которая, скорее всего, привлечет ваше внимание, если вы выполняе- те такое преобразование, является замена существующих в диалекте 1 столбцов типа date (который эквивалентен типу timestamp в диалекте 3) путем преобразования их в типы данных диалекта 3 date (только дата) или time (только время), casto легко вы- полняет эту работу. Пример одного из стилей преобразования с использованием casto см. в конце этой главы. Функция EXTRACT0 Функция extract о возвращает различные элементы, выделенные путем декодирова- ния полей типов дата/время. Она может работать с полями дата/время в диалекте 3 и в диалекте 1. Синтаксис Синтаксис функции extract (): EXTRACT (элемент FROM поле)
Глава 10. Типы даты и времени 197 элемент должен быть одним из допустимых элементов в типе данных поле. Не все элементы допустимы для всех типов данных дата/время. Тип данных элемента изме- няется в соответствии с выделяемым элементом. Табл. 10.10 перечисляет элементы, доступные для каждого типа дата/время. поле может быть столбцом, переменной или выражением, результатом вычисления которого является поле дата/время. Табл. 10.10 показывает ограничения на аргументы и их типы данных при использо- вании функции EXTRACT (). Таблица 10.10. Аргументы, типы и ограничения функции extracto Элемент Тип данных Ограни- чения TIMESTAMP/ диалект 1 date DATE TIME YEAR SMALLINT 0-5400 Допустимо Допустимо Не допустимо MONTH SMALLINT 1-12 Допустимо Допустимо Не допустимо DAY SMALLINT 1-31 Допустимо Допустимо Не допустимо HOUR SMALLINT 0-23 Допустимо Не допустимо Допустимо MINUTE SMALLINT 0-59 Допустимо Не допустимо Допустимо SECOND DECIMAL(6,4) 0-59.9999 Допустимо Не допустимо Допустимо WEEKDAY SMALLINT 0-6* Допустимо Допустимо Не допустимо YEARDAY SMALLINT 1-366 Допустимо Допустимо Не допустимо * 0 = воскресенье ... 6 = суббота. Объединение EXTRACTO с другими функциями Далее следуют два примера использования функции extracto внутри casto для по- лучения представлений даты, которые не могут быть получены использованием од- ной из функций. Получение даты и времени без долей секунды Хотя невозможно прямым преобразованием получить строку даты и времени без до- лей секунды, это может быть сделано при использовании выражения, включающего обе функции cast () и extract (). Выделение строки времени Эта техника больше нужна в диалекте 1, чем в диалекте 3. Тем не менее она может быть экстраполирована на любой тип даты или времени диалекта 3, если вам нужно сохранять время дня в виде строки. Функция extracto делает возможным выделение отдельных элементов типов даты и времени в значения smallint. Следующий триггер выделяет элементы времени из
198 Часть III. Типы данных Firebird и домены столбца диалекта 1 date с именем capture_date и преобразует их в char (13), имитируя стандартный в Firebird литерал времени 'HH:MM:ss.nnnn'. SET TERM Л; CREATE TRIGGER BI—ATABLE FOR ATABLE ACTIVE BEFORE INSERT POSITION 1 AS BEGIN IF (NEW.CAPTURE_DATE IS NOT NULL) THEN BEGIN NEW. CAPTURE—TIME = CAST(EXTRACT (HOUR FROM NEW.CAPTURE_DATE) AS CHAR(2)) | ! ':' I I CAST(EXTRACT (MINUTE FROM NEW.CAPTURE—DATE) ASCHAR(2))I| |j CAST (EXTRACT (SECOND FROM NEW.CAPTURE-DATE) AS CHAR(7)); END END Л SET TERM ;Л Пример преобразования типа дата/время Строка char(13), сохраняемая триггером в предыдущем примере, не имеет того "по- ведения," что тип time в диалекте 3. Тем не менее при простом преобразовании она может быть конвертирована напрямую в тип time диалекта 3 при последующем об- новлении до диалекта 3. Сначала мы добавляем новый временный столбец в таблицу для хранения конверти- рованной строки времени: ALTER TABLE ATABLE ADD TIME-CAPTURE TIME; COMMIT; Затем заполняем временный столбец строкой времени, выполняя преобразование в диалекте 1: UPDATE ATABLE SET TIME__CAPTURE = CAST (CAPTURE—TIME AS TIME) WHERE CAPTURE_TIME IS NOT NULL; COMMIT; Следующая вещь, которую мы должны сделать, — это временно удалить в нашем триггере ссылку на строку времени диалекта 1. Это нужно, чтобы устранить пробле- мы зависимости при изменении старой строки времени. SET TERM Л; RECREATE TRIGGER BI_ATABLE FOR ATABLE ACTIVE BEFORE INSERT POSITION 1 AS BEGIN /* ничего не выполняется */ END Л
Глава 10. Типы даты и времени 199 SET TERM J COMMIT; Теперь мы можем удалить старый столбец capturejtime: ALTER TABLE AT ABLE DROP CAPTURE_TIME; COMMIT; Создадим его опять, на этот раз как тип time: ALTER TABLE ATABLE ADD CAPTURE_TIME TIME; COMMIT; Перепишем данных из временного столбца в только что добавленный столбец capturejtime: UPDATE ATABLE SET CAPTUREJTIME = TIME_CAPTURE WHERE TIMEJCAPTURE IS NOT NULL; COMMIT; Удалим временный столбец: ALTER TABLE ATABLE DROP TIME_CAPTURE; COMMIT; Под конец изменим триггер так, чтобы он теперь записывал значение capture time как тип time: SET TERM Л; RECREATE TRIGGER BI_ATABLE FOR ATABLE ACTIVE BEFORE INSERT POSITION 1 AS BEGIN IF (NEW.CAPTURE_DATE IS NOT NULL) THEN BEGIN NEW. CAPTUREJTIME = CAST (NEW. CAPTURE. DATE AS TIME); END END л SET TERM ;л COMMIT; Все эти шаги могут быть записаны в скрипте SQL. Подробности использования скриптов SQL см. в разд. "Скрипты схемы" главы 14. Понимание функции EXTRACTO Функция extracto вызывает исключение, если она получает пустой аргумент. Этот факт можно использовать в простых запросах для проверки условия not null или в выражениях подзапросов при декодировании полей типа дата/время. Тем не менее во
200 Часть III. Типы данных Firebird и домены внешних соединениях это не столь просто, потому что потоки внешнего соединения, которые не соответствуют условиям последнего, возвращают null в незаполненных полях. Рекомендуется использовать подзапрос Сем. главы 21 и 22), который ограничивает вызовы функции только при ненулевых значениях. В диалекте 3 есть другое реше- ние: использовать выражение case (см. главу 21) для исключения вызова extracto при нулевых датах. Пора дальше Следующая глава охватывает большую тему использования символьных (строковых) типов данных в Firebird, включая важные вопросы определения и работы с интерна- циональными наборами символов и порядком сортировки для баз данных и столбцов.
ГЛАВА 1 1 Символьные типы данных Firebird поддерживает символьные (строковые) типы данных фиксированной и пере- менной длины. Они могут быть определены для локального использования в любом наборе символов, выбираемом из большого списка. Символьные типы фиксирован- ной длины не могут превышать 32 767 байт абсолютной длины; для типов перемен- ной длины этот предел уменьшается на два байта, которые при сохранении строки содержат счетчик символов. Firebird хранит строки очень экономно, используя простой алгоритм сжатия данных, даже если это тип char или nchar. В том случае, когда вы хотите объявить очень большой строковый столбец, помните, что существует множество причин не исполь- зовать длинные строки — ограничения клиентской памяти или размеров индекса, а для Firebird 1.0.x еще и декомпрессия строк фиксированной и переменной длины в объявленную длину до того, как они покинут сервер. Основы использования строк Атрибут символьных типов character set важен не только для совместимости с ин- терфейсом локализованных приложений, но также в некоторых случаях для опреде- ления размера столбца. Отдельные наборы символов используют несколько байтов для хранения одного символа— обычно два или три в Firebird. Когда используются такие наборы символов, максимальный размер уменьшается в два или три раза. ПРИМЕЧАНИЕ. Атрибут character set в объявлении является необязательным. -К Если никакой набор символов не определяется на уровне столбца, то атрибут х character set устанавливается в значение набора символов по умолчанию для базы данных. Механизм определения набора символов для столбцов и перемен- ных обсуждается более подробно позже в этой главе. Попытка помещения в строковый столбец Firebird строки с длиной, превышающей объявленную, вызывает ошибку переполнения. Ограничитель строки Ограничителем строк в Firebird является символ ASCII 39, или одиночная кавычка, или апостроф, например, StringVar = 'This is a string.';
202 Часть III. Типы данных Firebird и домены Двойные кавычки вовсе запрещены для ограничения строк. Вы должны помнить это, если соединяетесь с БД Firebird, используя код приложения, написанного для баз данных InterBase 5, где разрешалось использовать кавычки в качестве ограничителя строк. Строки должны быть исправлены также в исходном коде хранимых процедур и триггеров в базе данных InterBase 5, если вы планируете перекомпилировать их для Firebird. Конкатенация Firebird использует стандартный в SQL символ для конкатенации (соединения) строк: двойной символ ASCII с кодом 124, известный как двойная вертикальная черта (||). Он может быть использован для конкатенации строковых констант, строковых выра- жений и/или значений столбцов, например: MyBiggerString = 'You are my sunshine,1 || FirstName I| ' my only sunshine. Символьные элементы могут соединяться с числами и числовыми выражениями для получения алфавитно-цифровых строк. Например, для конкатенации символа с целым: NEW.TICKET_NUMBER = || NEW.PK_INTEGER; ' \ ВНИМАНИЕ! Не используйте выражения конкатенации, где один из элементов / f \ может иметь значение null. Результатом любой конкатенации, содержащей null, А- будет NULL. Управляющие символы Как правило, Firebird не поддерживает использование управляющих символов для включения непечатаемых кодов или последовательностей в строковые поля. Единст- венным исключением является "дублирование" символа апострофа (ASCII 39) для включения его в качестве хранимого символа и исключения его интерпретации как терминального ограничителя строки: SET HOSTELRY = ’О’'Flaherty1’s Pub' В строках можно хранить непечатаемые символы. Может быть объявлена функция UDF Asciichar (азс11_знатение) в библиотеке ib udf, чтобы дать возможность переда- вать в строки такие символы или их последовательности. Следующий оператор вы- водит множество текстовых полей — например, во внешний файл — с символами возврата каретки и перевода строки в последнем поле: INSERT INTO EXTFILE(DATA1, DATA1, DATA3, CRLF) VALUES ('Stringl', 'String2', 'String3', Ascii_Char(13) | |Ascii_Char(10));
Глава 11. Символьные типы данных 203 По поводу объявления Asciichar (..) и других функций в библиотеке ib udf смотрите в подкаталоге ../UDF в корневом каталоге инсталляции Firebird скрипт с именем ib udf.sql. Подробности о внешних функциях см. в приложении 1. Ограничения символьных типов Ограничения многобайтовых наборов символов Важно быть в курсе того, как многобайтовые наборы символов влияют на размеры текстовых элементов, особенно имеющих переменный размер. Например, в наборе символов unicode fss даже 256-символьный столбец будет иметь больший размер — потенциально 770 байт— как для хранения данных, так и для поиска. Дальше в этой главе будет много сказано об осторожности, которую вы должны проявить, решая вопрос о хранении текстов для многобайтовых наборов символов. Ограничения индексов При решении вопросов размера, набора символов и последовательности сортировки для символьного столбца вам нужно убедиться, что индексируемые столбцы этих типов достаточно ограничены по размеру. В настоящее время (версия 1.5) общий размер любого индекса не может превышать 252 байта— заметьте, байтов, а не символов. Многобайтовые и многие более сложные однобайтовые наборы символов используют много больше байтов, чем простые наборы символов. Многосегментные индексы используют дополнительные байты, как и последовательности сортировки. Просчитайте количество байтов в процессе проектирования! Подробности см. в главе 18, обратите внимание на разделы о наборах символов и последовательностях сортировки далее в этой главе. Использование памяти клиента Программы клиента будут выделять память для хранения копий строк, которые они считали из базы данных. Многие уровни интерфейсов выделяют достаточное количе- ство ресурсов для максимального (т. е. определенного) размера значений столбцов фиксированной и переменной длины, даже если фактически никакие данные не со- хранены в таком размере. Буферизация большого количества строк может использо- вать слишком большой объем памяти, и пользователи будут жаловаться на задержки при обновлении экрана и на потерю соединения. Рассмотрим, например, какое влияние окажет на рабочую станцию запрос, возвра- щающий 1024 строки, каждая из которых содержит один столбец, объявленный как varchar(1024) . Даже с самым "скромным" набором символов этого столбца потребу- ется, по меньшей мере, 1 Мбайт памяти клиента. Для столбца Unicode умножьте эту величину на три. Символьные данные фиксированной длины Строковые типы данных фиксированной длины в Firebird используются для хранения строк, длина которых является одной и той же или очень близкой, либо там, где фор-
204 Часть III. Типы данных Firebird и домены мат или относительная позиция символов может передавать семантическое содержа- ние. Обычно они применяются для таких элементов, как идентификационные коды, номера удаленной связи, базирующиеся на символах цифровые системы, а также для объявления полей с целью хранения предварительно форматированных строк фикси- рованной длины, чтобы конвертировать их в другие типы данных — например, лите- ралы даты Firebird. Начальные символы пробелов (символ ASCII 32) во вводимых строках фиксирован- ной длины являются значимыми, в то время как завершающие — нет. При сохране- нии строк фиксированной длины Firebird убирает конечные пробелы. Строки оты- скиваются без избыточного расширения до объявленной длины. Использование типов фиксированной длины не рекомендуется для данных, которые могут содержать значимые конечные символы пробелов, или для элементов, чья фак- тическая длина может сильно изменяться. CHAR(n), алиас для CHARACTER(n) CHAR(n), алиас для снакастек(п), является основой символьного типа фиксированной Длины, п представляет точное количество хранимых символов. Этот тип данных мо- жет хранить строки любого поддерживаемого набора символов. < ПРИМЕЧАНИЕ. Если аргумент длины, п, в объявлении отсутствует, то предпола- гается CHAR(l). Допустимо объявлять односимвольные ПОЛЯ CHAR как просто CHAR. NCHAR(n), алиас для NATIONAL CHARACTER(n) nchar (n), алиас для national снак(п), является специализированной реализацией ти- па CHAR(n) с предварительно установленным атрибутом набора символов iso8859_i. Естественно, недопустимо определять атрибут набора символов для столбца nchar, хотя последовательность сортировки — последовательность, в которой будут сорти- роваться символы для поиска упорядочения вывода, — может быть объявлена для столбца или домена, которые используют этот тип. Подробные разделы о наборах символов и последовательностях сортировки присут- ствуют далее в этой главе. Символьные данные переменной длины Строковые типы данных переменной длины в Firebird используются для хранения строк, длина которых может изменяться. Обязательный аргумент размера п ограни- чивает количество символов, которые могут храниться в столбце максимум п симво- лами. Размер типа varchar не может превышать 32 765 байтов, потому что Firebird добавляет два байта к размеру элемента для каждого объекта varchar.
Глава 11. Символьные типы данных 205 Выбор, хранение и поиск текстов переменной длины Символьный тип переменной длины используется для хранения текстов, потому что размер хранимой структуры равен фактическому размеру данных плюс два байта. Все символы, введенные в поле переменной длины, трактуются как значимые, вклю- чая начальные и конечные пробельные символы. Транспортировка в сети До Firebird 1.5 найденные текстовые элементы данных переменной длины дополня- лись на сервере до полного, объявленного размера до передачи клиенту. Начиная с Firebird 1.5, данные не дополняются. На момент написания этой книги такая возмож- ность для текстов переменной длины не была выполнена для Firebird 1.0.x, что может повлиять на ваш выбор размера и типа столбца, если вы пишете приложения для уда- ленных клиентов, соединяющихся с сервером 1,0.x в медленной сети. Хотя типы переменной длины могут хранить строки почти в 32 Кбайтах, на практике не рекомендуется использовать их для элементов данных, длиннее, чем 250 байт, особенно если их таблицы будут увеличиваться в размерах или если они часто будут субъектом запросов select. Тип данных blob с подтипом sub_type 1 (текст) обычно лучше подходит для хранения больших строковых данных. Тексты blob подробно обсуждаются в следующей главе. VARCHAR(n), алиас для CHARACTER VARYING(n) VARCHAR(n), алиас для character varying (п), является базовым строковым типом пере- менной длины, п представляет максимальное количество символов, которое может сохраняться в столбце. Этот тип хранит строки любого поддерживаемого набора символов. Если никакой набор символов не указан, атрибут примет значение набора символов по умолчанию, который был определен в операторе create database в предложении default character set. Если не существует набора символов по умолча- нию, то столбец получит CHARACTER set none. NCHAR VARYING(n), алиас для NATIONAL CHAR VARYING(n) NCHAR VARYING(n), аЛИЭС ДЛЯ NATIONAL CHAR VARYING (n), КОТОРЫЙ В СВОЮ ОЧереДЬ ЯВЛЯСТ- ся алиасом для national .character varying (n) — это специализированная реализация типа vARCHAR(n) с предварительно установленным атрибутом набора символов ISO8859 1. Недопустимо определять атрибут набора символов для столбца nchar varying, хотя последовательность сортировки — последовательность, в которой бу- дут сортироваться символы для поиска упорядочения вывода — может быть объяв- лена для столбца или домена, которые используют этот тип. Наборы символов и последовательность сортировки Набор символов, выбранный для хранения текстовых данных, определяет: ♦ символы, которые могут быть использованы в столбцах char, varchar и blob sub__type 1 (текст);
206 Часть III. Типы данных Firebird и домены ♦ число байтов, выделяемых для каждого символа; ♦ последовательность сортировки по умолчанию (алфавитно-цифровой порядок), используемая при сортировке столбцов char и varchar (столбцы blob не могут сор- тироваться — так что последовательность сортировки для них не применяется). Если для столбца вы не укажете набор символов, то для него будет использован на- бор символов по умолчанию базы данных. Если для базы данных не указан набор символов по умолчанию, то столбец получит значение character set none. Если ваша база данных используется в окружении, где присутствует только английский язык, у вас может появиться соблазн не использовать набор символов. Не соблазняйтесь! Набор символов none безропотно примет любые однобайтовые символы. Проблемы появятся— в неанглийском окружении или при наличии смешанных языков— вы получите ошибку транслитерации при выборе ваших текстовых данных. То, что уходит, не всегда то же самое, что приходит! Текст, вводимый с клавиатуры или с других устройств ввода, например с устройства считывания штрихового кода, особым образом кодируется в соответствии с некото- рой стандартной кодовой страницей, которая может быть связана с диалектом, за- данным при установке вводящего устройства. Обычно входные устройства снабжа- ются программами-адаптерами, дающими возможность пользователям по желанию переключать кодовую страницу. В одной кодовой странице числовой код, соответствующий образу некоторого сим- вола, может отличаться от кода в другой кодовой странице. В основном каждый на- бор символов Firebird отображает некоторую кодовую страницу или группу связан- ных кодовых страниц. Некоторые наборы символов работают более чем с одной ко- довой страницей, в отдельных случаях кодовая страница будет работать более чем с одним набором символов. Различные языки могут использовать один общий набор символов, но по-разному отображая пары прописные/строчные буквы, символы ва- люты и др. Помимо набора символов различные страны, языки и даже культурные группы, при- меняющие то же самое распределение символов, используют различные последова- тельности для определения "алфавитно-цифрового порядка" для сортировки и срав- нений. Следовательно, для большинства наборов символов Firebird предоставляет множество последовательностей сортировки. Некоторые последовательности сор- тировки также учитывают пары прописные/строчные буквы для решения задачи упо- рядочивания, не чувствительного к регистру. Предложение collate используется в отдельных контекстах, где важна последовательность сортировки, хотя оно и не объ- является на уровне базы данных. Серверу нужно знать, какой набор символов используется при хранении данных, чтобы определить размер требуемой памяти и оценить характеристики сортировки для правильного упорядочивания, сравнения, перевода символов в верхний и нижний регистры и т. д. Помимо этого, он безразличен к символам вводимого текста. Набор символов клиента Что по-настоящему имеет значение в отношении наборов символов — это взаимо- действие между сервером и клиентом. Клиентская библиотека Firebird должна пере- давать атрибут набора символов как часть параметров запроса на соединение.
Глава 11. Символьные типы данных 207 Если сервер обнаруживает различие между установленным для клиента набором символов и хранимым в базе данных, то автоматически будет выполнена трансля- ция — "транслитерация" — в предположении, что входящие коды являются коррект- ными для клиентской кодовой страницы. Входящие коды будут преобразовываться в коды, корректные для соответствующих символов в наборе символов объекта хра- нения. Это делает возможным хранение текстов в различных объектах, которые имеют на- боры символов, отличные от набора символов базы данных по умолчанию. Если наборы символов клиента и объекта одни и те же, то сервер предполагает, что получаемые им коды из этого набора символов, и сохраняет их без изменения. Не- приятности возникают, если данные не являются такими, как об этом сообщил кли- ент. Когда данные выбираются, отыскиваются или восстанавливаются после резерв- ного копирования, это приводит к ошибкам транслитерации. Более подробную информацию об ошибках транслитерации и их исправлении см. в разд. "Транслитерация " далее в этой главе. Приложения, подключающиеся к базе данных, должны передавать набор символов базы данных в API через блок параметров базы данных (Database Parameter Block, DPB) в параметре isc_dpb_ic_ctype. Приложение ESQL — включая утилиту isql — должно выполнить оператор set names непосредственно перед оператором connect. Команда set names <набор-символов> используется для установки набора символов в утилите isql. Графический интерфейс инструментов администратора обычно предос- тавляет возможность выбора или явного указания клиентского набора символов. Если вам нужно использовать язык, отличный от английского, потратьте некоторое время на изучение доступных наборов символов и выбора того, который наиболее соответствует вашим требованиям к вводу, хранению и выводу текстов. Не забудь- те включить этот набор символов в атрибуты базы данных при создании базы дан- ных. Синтаксис см. в разд. "Обязательные и необязательные атрибуты" главы 15. Список наборов символов, распознаваемых Firebird, см. в приложении 8. Переопределение набора символов Имея глобальный набор символов по умолчанию для базы данных, вы можете при необходимости в дальнейшем переопределить его. Вы можете включить атрибут на- бора символов при определении домена. Вы можете переопределить значение набора символов по умолчанию для базы данных или для домена при определении индиви- дуального столбца. Д ВНИМАНИЕ! Когда столбцы используют значение набора символов по умолча- нию для базы данных, изменение набора символов по умолчанию для базы дан- ных повлияет только на вновь создаваемые столбцы и домены. Существующие столбцы сохранят имеющееся значение набора символов.
208 Часть III. Типы данных Firebird и домены Наборы символов Firebird Firebird поддерживает увеличивающееся количество интернациональных наборов символов, включая 2- и 3-байтовые наборы Unicode. Во многих случаях возможен выбор последовательности подбора (сортировки). В этом разделе мы рассмотрим: ♦ происхождение наборов символов; ♦ глобальные наборы символов по умолчанию для базы данных; ♦ альтернативные наборы символов и последовательности сортировки для доменов и столбцов; ♦ последовательности сортировки для: • текстовых значений в операциях сравнения; • предложений order by и group by; ♦ как указать серверу необходимость трансляции вводимых данных в конкретный набор символов. Набор символов является собранием символов, который включает, по меньшей мере, один репертуар символов. Репертуар символов является набором символов, исполь- зуемым в конкретной культуре для публикаций, письменной коммуникации и — в контексте базы данных — для компьютерного ввода и вывода. Например, ISO Latin 1 является набором символов, который охватывает английский (А, В, С ... Z) и французский (А, А, А, В, С, Q, D ... Z) репертуары, делающие его полезным для обо- их сообществ. Именование наборов символов Большинство наборов символов Firebird определены на основании стандартов и их имена близко соответствуют этим стандартам. Например, Microsoft определяет Windows 1251, a Firebird реализует его как WIN1251. Набор символов ISO8859 1 яв- ляется "набором символов, определенным в стандарте ISO 8859-1, кодированным значениями, определенными в стандарте ISO 8859-1, каждое значение представлено одним 8-битовым байтом". Алиасы Имена алиасов наборов символов поддерживают разницу в именовании стандартов между платформами. Например, если вы найдете, что в операционной системе ис- пользуется идентификатор win 1251 для набора символов WIN1251, вы можете ис- пользовать алиас, определенный в системной таблице rdb$types, как описано в сле- дующем разделе. Хранение наборов символов и алиасов Наборы символов в настоящий момент "зашиты" в базу данных с момента ее создания. Одной из системных таблиц, создаваемых автоматически, является rdb$character_set. Для отображения имен наборов символов с последовательностью сортировки каждого из них выполните запрос:
Глава 11. Символьные типы данных 209 SELECT RDB$CHARACTER_SET_NAME, RDB$DEFAULT_COLLATE_NAME, ROBS BYTES_PER_CHARACTER FROM RDB$CHARACTER_SETS ORDER BY 1 ; Если требуется, алиасы помещаются в rdb$types— другую системную таблицу, ко- торая хранит список алиасов, используемых сервером базы данных. Для просмотра всех алиасов, которые были установлены во время создания базы данных, выполните следующий запрос, который фильтрует rdbStypes для просмотра только имен наборов символов: SELECT С. RDB$CHARACTER_SET_NAME, T.RDB$TYPE_NAME FROM RDBSTYPES T JOIN RDBSCHARACTER_SETS C ON C.RDB$CHARACTER_SET_ID = T.RDBSTYPE WHERE T.RDB$FIELD_NAME = 'RDB$CHARACTER_SET_NAME' ORDER BY 1 ; ПРИМЕЧАНИЕ. Для того чтобы использовать наборы символов, отличные от NONE, ASCII, OCTETS и UNICODE_FSS, необходимо иметь библиотеку fbintl в каталоге /inti корневого каталога Firebird. Ограничения хранения Важно понимать, как ваш выбор набора символов влияет на хранение планируемых вами ограничений для данных. В случае столбцов char и varchar Firebird ограничива- ет максимальный объем памяти хранения любого поля в столбце значениями 32 767 и 32 765 соответственно. На самом деле требуемое фактическое количество может быть сильно ограничено. Неиндексируемые столбцы, использующие последовательность сортировки по умол- чанию, МОГуТ хранить не более (количество символов')* (количество байтов на символ) для типа данных. Например, varchar<32765) с набором символов ISO 8859 1 может хранить не более 32 765 символов, тогда как при наборе символов UN1CODEFSS (который использует три байта на символ) максимальное количество 10 291 символ. Если столбец предполагается индексировать и/или изменить предложением collate, должно быть добавлено значительное количество "запасных" байтов. Даже наименее требовательный индекс — один столбец varchar, использующий однобайтовый набор символов и последовательность сортировки по умолчанию — ограничен размером 252 байта для Firebird версии 1.5 и выше. Для столбцов с многобайтовыми наборами СИМВОЛОВ количество СИМВОЛОВ меньше, чем 252/(количество байтов на символ). Мно- гостолбцовые индексы требуют больше байтов, чем одностолбцовые, а те, которые используют последовательность сортировки не по умолчанию, требуют еще больше.
210 Часть III. Типы данных Firebird и домены Более подробно об этих эффектах см. разд. "Последовательность сортировки и раз- мер индекса" далее в этой главе. СОВЕТ. При проектировании столбцов всегда рассматривайте возможные тре- бования с точки зрения использования набора символов, индексирования и клю- ча. Всегда держите "черновую" таблицу в разрабатываемой базе данных для тестирования ограничений индексов и ключей. Хранение столбцов blob, которые не являются индексируемыми, никак не ограничи- вается использованием набора символов. Набор символов по умолчанию Для базы данных Если вы не указываете набор символов по умолчанию для базы данных в объявлении create database, то набор символов по умолчанию устанавливается в none. Набор символов none не предполагает никакого набора символов для текстовых столбцов, сохраняя данные точно в том виде, в каком они были введены. Если клиентское со- единение не указывает набора символов, то данные также будут отыскиваться точно так, как они были введены. Алфавитно-цифровое упорядочение ограничено упорядо- чением кодов ASCII, а преобразование верхний/нижний регистр поддерживается только в кодах U.S.ASCII 65—90 и 97—102 соответственно. Указывайте допустимый код набора символов в предложении default character set: CREATE DATABASE '/data/adatabase.fdb' DEFAULT CHARACTER SET WIN1251; Более подробную информацию об операторе create database см. в главе 12. Переопределение набора символов на уровне столбца Атрибут набора символов может быть добавлен к индивидуальному определению домена, столбца таблицы или переменной PSQL типа char, varchar или blob sub type 1 для перекрытия набора символов по умолчанию базы данных. Например, следующий фрагмент скрипта создает базу данных с набором символов по умолчанию ISO8859_1 и таблицу, содержащую различные версии языка похожих данных в отдельных столбцах: CREATE DATABASE '/data/authors.fdb' DEFAULT CHARACTER SET ISO8859_1; CREATE TABLE COUNTRY_INTL( CNTRYCODE BIGINT NOT NULL, NOM_FR VARCHAR(30) NOT NULL, /* использует набор символов по умолчанию */ NOM_EN VARCHAR(30), /* использует набор символов по умолчанию */ NOM_RU VARCHAR(30) CHARACTER SET WIN1251, NOM_JP VARCHAR(30) CHARACTER SET SJIS_0208
Глава 11. Символьные типы данных 211 Другой фрагмент того же скрипта создает домен для хранения данных blob в наборе символов кириллицы: CREATE DOMAIN MEMO_RU AS BLOB SUB_TYPE 1 CHARACTER SET WIN1251; Позже в этом скрипте мы создаем таблицу, которая хранит некоторый текст в кирил- лице: CREATE TABLE NOTES_RU ( DOC_ID BIGINT NOT NULL, NOTES MEMO_RU ); Следующий фрагмент определяет хранимую процедуру, которая преобразует вход- ную строку в другой набор символов перед сохранением ее в таблице: CREATE PROCEDURE CONVERT_NOTES ( INPUT^TEXT VARCHAR(300) ) AS DECLARE VARIABLE CONV_STRING VARCHAR(300) CHARACTER SET WIN1251; BEGIN IF (INPUTJTEXT IS NOT NULL) THEN BEGIN CONV_STRING = JVIN1251 1'|l:INPUTJTEXT; /* использует INTRODUCER */ INSERT INTO NOTES_RU (DOC_ID, NOTES) VALUES (GEN_ID (ANYGEN, 1),:CONV_STRING); END END " Создание доменов объясняется в главе 13. Полный синтаксис оператора create table описан в главе 15. Объявление переменных в PSQL см. в главе 30. Переопределение набора символов на уровне оператора Набор символов для текстовых значений в операторе интерпретируется в соответст- вии с набором символов соединения в процессе выполнения (а не в соответствии с набором символов, определенным для столбца при его создании), если только вы не зададите маркер набора символов (или "представитель") для указания другого набора символов. INTRODUCER — маркер набора символов Маркер набора символов — также известный как introducer— состоит из имени на- бора символов, перед которым стоит символ подчеркивания. Он требуется для "пред- ставления" входной строки, когда приложение клиента соединено с базой данных с использованием набора символов, отличного оттого, который определен для столбца в базе данных. Установите маркер слева от отмечаемого текстового значения. Например, маркером для ввода в UNICODE_FSS поле является _unicode_fss:
212 Часть III. Типы данных Firebird и домены INSERT INTO EMPLOYEE(Emp_ID, Emp_Name) values(1234, _UNICODE_FSS 'Smith, John Joseph'); СОВЕТ. Для ясности вы можете вставить пробел между маркером и строкой без какого-либо влияния на способ синтаксического анализа вводимого данного. Строковый литерал Строковый литерал в условии проверки или поиска, например в предложении where, интерпретируется в соответствии с набором символов клиентского соединения в мо- мент проверки условия. Маркер потребуется, когда отыскиваемый столбец базы дан- ных имеет набор символов, отличный от того, который был указан в клиентском со- единении: ... WHERE name = _ISO8859_1 'joe'; СОВЕТ. Когда вы разрабатываете приложение со смешанными наборами сим- волов, то удобно использовать маркеры, особенно если ваше приложение будет работать со многими базами данных и/или будет распространяться интернацио- нально. Транслитерация Преобразование символов из одного набора символов Firebird в другой — например, конвертирование из DOS437 в ISO8859_1 — является транслитерацией. Транслите- рация в Firebird сохраняет точность символов: по определению она не подставляет никакого "заменителя" для входного символа, который не представлен в выходном наборе символов. Назначением такого ограничения является гарантия того, что воз- можна транслитерация одного и того же текста из одного набора символов в другой в любом направлении без потери символов в процессе транслитерации. Ошибки транслитерации Firebird выдает сообщение об ошибке, если символ во входном наборе не имеет точ- ного представления в выходном наборе. Пример, где может появиться ошибка транслитерации: когда приложение передает данные некоторого неопределенного набора символов в столбец, определенный с none, и позже пытается выбрать эти данные и поместить в другой столбец, который был определен с отличающимся набором символов. Хотя вы думаете, что это должно работать, потому что образы символов, похоже, принадлежат набору символов столбца назначения, транслитерация будет ошибочной, поскольку символ не пред- ставлен в наборе символов столбца назначения. Исправление ошибок транслитерации Как вы можете работать с группой символьных данных, которые вы сохранили с ис- пользованием неверного набора символов? "Трюк" заключается в использовании на-
Глава 11. Символьные типы данных 213 бора символов OCTETS в качестве "промежуточного аэродрома" между ошибочным и правильным кодированием. Поскольку OCTETS является специальным набором символов, который, не глядя, сохраняет то, что вы ему подсовываете (без транслите- рации), он является идеальным для того, чтобы сделать символьные коды нейтраль- ными в отношении кодовой страницы. Предположим, ваша проблемная таблица имеет столбец col_original, который вы случайно создали с набором символов none, когда имели в виду character set WIN1251. Вы загрузили в этот столбец данные на русском языке, но каждый раз, когда вы пытаетесь получить из него данные, вы получаете противную ошибку транслите- рации. Вот что вам нужно сделать: ALTER TABLE TABLEA ADD COL_WIN1251 VARCHAROO) CHARACTER SET WIN1251; COMMIT; UPDATE TABLEA SET COL_WIN1251 = CAST (COL__ORIGINAL AS CHAR(30) CHARACTER SET OCTETS); Теперь у вас есть временный столбец, созданный для хранения русских текстов, он хранит все из ваших "потерянных" текстов из неиспользуемого столбца col original. Вы можете удалить столбец col_original, а затем новый столбец col_original с кор- ректным набором символов. Просто скопируйте данные из временного столбца, и после подтверждения транзакции удалите временный столбец: ALTER TABLE TABLEA DROP COL_ORIGINAL; COMMIT; ALTER TABLE TABLEA ADD COL-ORIGINAL VARCHAR(30) CHARACTER SET WIN1251; COMMIT; UPDATE TABLEA SET COL-ORIGINAL = COL_WIN1251; COMMIT; /* Было бы разумным сейчас посмотреть ваши данные! */ ALTER TABLE TABLEA DROP COL_WIN1251; COMMIT; Набор символов для клиентского соединения Когда клиентское приложение, например, isql, соединяется с базой данных, в прото- коле соединения присутствует часть, которая информирует сервер о требуемом набо- ре символов. Набором символов соединения является нейтральный набор символов none, если не указано другое с использованием: ♦ set names во встроенном приложении или в isql; ♦ параметра isc_dpb_ic ctype в блоке параметров базы данных (DPB) для API- функции isc_attach_database (). Классы RAD соединения с базой данных для Delphi, Java и других обычно представляют этот параметр как свойство.
214 Часть III. Типы данных Firebird и домены Клиентское приложение задает набор символов до его соединения с базой данных. Например, следующая команда isql определяет, что isql использует набор символов ISO88591. По команде происходит соединение с базой данных autord.fdb из нашего предыдущего примера: SET NAMES WIN1251; CONNECT 'Iserver:/data/authors.fdb' USER 'ALICE' PASSWORD 'XINEOHP'; Специальные наборы символов Основное правило для наборов символов то, что каждый байт (пара или тройка бай- тов в случае многобайтовых наборов) специально определен по стандарту его реали- зации. Существует четыре особых исключения — NONE, OCTETS, ASCII и UNICODE FSS. В табл. 11.1 показаны специальные свойства этих наборов. Таблица 11.1. Специальные наборы символов Имя Свойства NONE Каждый байт является частью строки, но не имеется никаких предположе- ний, к какому набору символов он принадлежит. Код клиентской стороны или определенный пользователем на сервере код является ответственным за правильность символа OCTETS Байты, которые не интерпретируются как символы. Полезен для хранения двоичных данных ASCII Значения 0—127 определены как ASCII. Значения за пределами этого диа- пазона не являются символами, но поддерживаются. Firebird совершенно либерален относительно транслитерации байтов в диапазоне 0—127 сим- волов ASCII UNICODE_FSS Разработчикам нужно знать, что он эффективен при реализации UTF8. Пользователям нужно знать, что он может быть использован для хранения символов UCS16, но не UCS32 (может занимать до шести байтов на сим- вол). Недоступна ни одна последовательность сортировки, кроме двоичной последовательности по умолчанию ISO8859_1 (LATIN_1) и WIN1252 Набор символов 1SO8859_1 часто указывается для поддержки европейских языков. ISO8859_1, также известный как LATIN1, является истинным подмножеством WIN 1252. Microsoft добавил символы в позиции, которые ISO специфицировал как не являются символами (не "неопределенные", но указанные как "не символы"). Firebird поддерживает как WIN 1252, так и ISO8859 1. Вы всегда можете выполнить транслитерацию из ISO8859 1 в WIN 1252, но транслитерация WIN 1252 в ISO8859_1 может вызвать ошибки. Наборы символов для Microsoft Windows Пять наборов символов поддерживают приложения клиентов Windows, такие как Paradox for Windows. Это наборы символов WINI250, WIN1251, WIN1252, WIN1253 и WIN 1254.
Глава 11. Символьные типы данных 215 Благодаря историческим связям Borland с Paradox и dBase, имена последовательно- стей сортировки этих наборов символов, специфичных для Paradox for Windows, на- чинаются с "PXW" и соответствуют языковым драйверам Paradox/dBase, поставляе- мым с ныне устаревшим Borland Database Engine (BDE). Понимание наборов символов WINnnn___________________________________ Последовательности сортировки PXW действительно реализуют сортировку для Paradox и dBase, включая все ошибки. Одно исключение: PXW_CSY исправлен в Firebird 1.0. Следовательно, базы данных InterBase, которые его используют, напри- мер в индексах, не являются совместимыми с Firebird. Более подробную информацию о наборах символов Windows и сортировках Paradox for Windows см. в соответствующей документации по BDE и драйверам. Список международных наборов символов и последовательностей сортировки, под- держиваемые Firebird, см. в приложении 8. Последовательности сортировки Каждый набор символов имеет последовательность сортировки (collate) по умолча- нию, которая определяет, как символы сортируются и упорядочиваются. Последова- тельность сортировки определяет правила предшествования, которые Firebird ис- пользует для сортировки, сравнения и транслитерации символьных данных. Поскольку каждый набор символов имеет свое возможное подмножество последова- тельностей сортировки, то набор символов, который вы выбираете при определении столбца, ограничивает ваш выбор. Вы должны выбрать последовательность сорти- ровки, которая поддерживается набором символов, заданным для столбца. Последовательность сортировки для столбца задается при создании или модифика- ции столбца. Если устанавливается на уровне столбца, то перекрывает любую уста- новку последовательности сортировки на уровне домена. Отображение доступных последовательностей сортировки Следующий запрос дает список наборов символов с доступными последовательно- стями сортировки: SELECT С. RDB$CHARACTER_SET_NAME, С О. RDB S COLLAT IONJIAME, СО. RDB$COLLATION_ID, СО. RDB$ CHARACTER^ ET_ID, СО. RDB$ COLLAT ION_ID * 256 + CO.RDB$CHARACTER_SET_ID AS TEXTTYPEID FROM RDB$COLLATIONS CO JOIN RDB$CHARACTER_SETS C ON CO.RDB$CHARACTER~SET_ID = C.RDB$CHARACTER_SET_ID;
216 Часть III. Типы данных Firebird и домены Именование последовательностей сортировки Многие имена последовательностей Firebird используют соглашение по именованию XXYY, где XX — двухбуквенный код языка, a YY — двухбуквенный код страны. Например, DE DE — имя последовательности для немецкого языка, используемого в Германии, FRFR— для французского языка, используемого во Франции, FR CA — для французского языка, используемого в Канаде. Когда набор символов предоставляет выбор сортировки, одна из них с именем, соот- ветствующим имени набора символов, является последовательностью сортировки по умолчанию, которая реализует двоичное сравнение для набора символов. Двоичное сравнение сортирует набор символов по числовому коду, используемому для пред- ставления символов. Некоторые наборы символов поддерживают альтернативные последовательности сортировки, которые используют различные правила определе- ния предшествования. В этом разделе описывается задание последовательности сортировки для наборов символов в доменах и столбцах таблиц, в строковых сравнениях, в предложениях ORDER BY И GROUP BY. Последовательность сортировки для столбца Когда в таблице создается столбец char или varchar с использованием create table или alter table, последовательность сортировки для столбца может быть задана с использованием предложения collate. Предложение collate особенно полезно для таких наборов символов, как ISO8859 1 и DOS437, которые поддерживают множест- во различных последовательностей сортировки. К примеру, следующий динамический оператор alter table добавляет новый столбец в таблицу и задает и набор символов, и последовательность сортировки: ALTER TABLE 'EMP^CANADIEN' ADD ADDRESS VARCHAR(40) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL; Полный синтаксис alter table cm. в главе 16. Последовательность сортировки для строковых сравнений Может оказаться необходимым задать последовательность сортировки при сравне- нии значений char или varchar в предложении where, если сравниваемые значения используют различные последовательности сортировки, и это влияет на результат. Чтобы указать используемую последовательность сортировки для значения в процес- се сравнения, задайте предложение collate после значения. Например, следующий фрагмент предложения where задает конкретную последовательность сортировки для значения столбца в левой части операции сравнения при сравнении с входным пара- метром: WHERE SURNAME COLLATE PXW_SYRL >= :surname;
Глава 11. Символьные типы данных 217 В этом случае при несоответствии последовательностей сортировки могут быть раз- личные кандидаты для "больше чем" при разных последовательностях сортировки. Последовательность сортировки в критериях сортировки Когда столбцы char или varchar упорядочиваются в операторе select, может оказать- ся необходимым указать порядок сортировки для упорядочивания, особенно если столбцы в предложении упорядочивания используют различные последовательности сортировки. Чтобы задать последовательность сортировки для использования в упорядочиваемых столбцах, в предложение order by добавьте collate после имени столбца. Например, в следующем предложении order by задаются последовательности сортировки для двух столбцов: order by surname collate pxw_cyrl, first_name COLLATE PXW_CYRL; Полный синтаксис предложения order by cm. в главе 23. Последовательность сортировки в предложении GROUP BY Когда столбцы char или varchar группируются в операторе select, может оказаться необходимым указать порядок сортировки для группирования, особенно если столб- цы в предложении группировки используют различные последовательности сорти- ровки. Чтобы задать последовательность сортировки для использования в группируемых столбцах, в предложение group by добавьте collate после имени столбца. Например, в следующем предложении group by задаются последовательности сортировки для нескольких столбцов: GROUP BY ADDR_3 COLLATE PXW_CYRL, SURNAME COLLATE PXW_CYRL, FIRST-NAME COLLATE PXW-CYRL; Полный синтаксис предложения group by cm. в главе 23. Последовательность сортировки и размер индекса Если для набора символов вы задаете недвоичную сортировку (отличную от сорти- ровки по умолчанию), то размер индексного ключа может стать больше, чем храни- мая строка, если сортировка включает правила предшествования второго, третьего или четвертого порядка. Например, недвоичные сортировки для ISO8859_1 используют полные словари с пробелами и знаками пунктуации с четырьмя порядками значений. ♦ Первый порядок: А отличается от В. ♦ Второй порядок: А отличается от А.
218 Часть III. Типы данных Firebird и домены ♦ Третий порядок: А отличается от а. ♦ Четвертый порядок: важным является тип знака пунктуации (дефис, пробел, апо- строф). Например: Greenfly Green fly Green-fly Greensleeves Green sleeves Green spot Если же пробелы и знаки пунктуации трактуются как символы первого порядка, то тот же самый список будет отсортирован следующим образом: Greenfly Greensleeves Green fly Green sleeves Green spot Green-fly Как недвоичные сортировки могут ограничить размер индекса Когда создается индекс, он использует последовательности сортировки, определен- ные для каждого текстового фрагмента индекса. При использовании однобайтового набора символов ISO8859_1 с сортировкой по умолчанию структура индекса может содержать приблизительно 252 символа (меньше, если это многосегментный индекс). Если же вы выбираете недвоичную сортировку для ISO8859_1 (в том числе это отно- сится к сортировке PXW_CYRL кодировки WIN1251), то структура индекса может содержать только 84 символа, несмотря на то, что символы в индексируемом столбце занимают только один байт каждый. ВНИМАНИЕ! Некоторые сортировки ISO8859_1, например DE_DE, требуют в среднем три байта на символ для индексируемого столбца. Пользовательские наборы символов и сортировки Существует возможность создать собственные наборы символов и сортировки и за- ставить сервер Firebird загружать их из библиотеки, которая должна называться fbint!2, чтобы ее можно было распознать и подключить. Также можно реализовать пользовательские наборы символов и сортировки с ис- пользованием функций, определенных пользователем (UDF) для транслитерации входных данных. Сервер Firebird 1.5 автоматически использует UDF со специальны-
Гпава 11. Символьные типы данных 219 ми именами, чтобы их можно было распознать как наборы символов и сортировки. Имя ' usER_cHARSET_rmn1 указывает набор символов, в то время как 1 user_translate_ nnn_nnn' и 1 usER_TEXTTYPE__nnn' указывает набор символов плюс последовательность сортировки (ппл представляет трехсимвольное число, обычно в диапазоне от 128 до 254). Это сложная тема, выходящая за пределы данной книги. Разработчик для fbintl2 встраиваемых пользователем наборов символов David Brookestone Schnepper создал свободно распространяемый комплект "сделай сам", который содержит пример ко- да С, отображения и инструкции, доступный на http://www.ibcollate.com. Поскольку комплект поставки содержит ясные инструкции по созданию наборов символов, он также будет вам полезным справочником, если вы планируете использовать подход UDF для реализации пользовательского набора символов. Добавление собственных алиасов В экстремальной ситуации — когда вы используете нестандартную операционную систему, которая требует имя набора символов, не поддерживаемое в Firebird в каче- стве алиаса — вы можете добавить алиас. Для этого не существует простого способа; требуется прямая корректировка системных таблиц— такая практика, как общее правило, должна быть исключена. Прежде чем вы решите добавить новый пользова- тельский алиас, убедитесь, что Firebird не поддерживает нужный вам алиас — про- смотрите в приложении 8 списки алиасов около каждого имени набора символов. Инсталляция пользовательских алиасов включает прямое добавление строки в табли- цу rdb$types. Получите идентификатор набора символов, для которого вы собирае- тесь создать алиас — в таблице rdb$character_sets это значение столбца rdbscharacter_set_id — и убедитесь, что у вас правильный строковый литерал, кото- рый ваша операционная система распознает как набор символов, который вы хотите поддерживать. Предположим, вы хотите добавить алиас для набора символов ISO8859 1, который ваша ОС сможет распознать по литералу ’lc_iso88591'. Во-первых, получите иден- тификатор набора символов по запросу к таблице rdb$character_sets, используя ути- литу isql или другой интерактивный инструмент запросов: SELECT RDB$CHARACTER_SET_ID FROM RDB$CHARACTER_SETS WHERE RDB$CHARACTER_SET_NAME = 'ISO8859_11; Этот пример вернет идентификатор набора символов "21". Затем подготовьте и вы- полните оператор insert для добавления вашего алиаса в таблицу rdb$types: INSERT INTO RDB$TYPES ( RDBSFIELDJIAME, RDBSTYPE, RDB$TYPE_NAME) VALUES ('RDB$CHARACTER_SET_NAME', 21, 'LC_ISO88591'); Эта техника относительно безболезненна, если ваш пользовательский алиас пред- ставляет набор символов, нужный для определения столбца или домена, но она не требуется для набора символов базы данных по умолчанию. Просто убедитесь, что определение алиаса существует до того, как вы создаете столбец или домен, которым нужно его использовать.
220 Часть III. Типы данных Firebird и домены Существует проблема типа "уловка-22", если ваша операционная система по- настоящему не может поддерживать набор символов или алиас для набора символов, который вам нужно использовать по умолчанию. Ваша база может "узнать" о вашем алиасе только после создания базы данных, когда таблица rdb$types уже существует. Набор символов базы данных по умолчанию определяется в create database, а в этот момент доступны только объявленные в системе алиасы. В тот момент, когда rdbStypes существует, уже поздно назначать набор символов по умолчанию. Поскольку в настоящий момент Firebird не предоставляет способов изменения атри- бута набора символов по умолчанию — это не поддерживается в синтаксисе alter database, — существует только один способ: сначала создать базу данных, а затем, до того, как что-нибудь с ней делать, установить, как был описан ваш алиас, подтвер- дить транзакцию и изменить напрямую заголовочную запись базы данных: UPDATE RDB$DATABASE SET RDB$CHARACTER_SET_NAME = 'LC_ISO885911; COMMIT; Д ВНИМАНИЕ! Никогда не пытайтесь выполнить то же для любой базы данных, которая не является "пустой" — т. е. содержит определенные пользователем объекты. Пора дальше Теперь мы переходим к типам данных, которые Firebird реализует посредством больших двоичных объектов (blob), включая текст, нетипизированные двоичные и пользовательские форматы и специализированные реализации blob, которые Firebird представляет как типы array.
ГЛАВА 1 2 BLOB и массивы Типы blob (Binary Large Objects, большие двоичные объекты) являются сложными структурами, используемыми для хранения дискретных объектов данных переменно- го размера, который может быть очень большим. Они являются "сложными" в том смысле, что Firebird сохраняет эти типы в виде двух частей: специальная гиперссыл- ка (называется blob_id) сохраняется в собственной строке, в то время как сами дан- ные хранятся за пределами строки, часто на одной или нескольких страницах базы данных, на которые указывает blob_id. Firebird использует структуры blob для различных внутренних целей. Он также пре- доставляет две главные категории для пользовательских типов, применяющие этот вид структуры хранения: blob и массивы (array). Типы array могут быть использова- ны для представления однородных массивов большинства типов данных. Типы BLOB Почти любой вид сохраняемых данных может храниться в blob: графические картин- ки, векторные рисунки, звуковые файлы, видео, документы размером с главу или целую книгу, любой вид мультимедийной информации. Поскольку blob может со- держать различные виды информации, он требует специальной обработки чтения и записи на клиенте. Типы blob могут, когда это возможно', хранить содержимое файлов, сгенерирован- ных другими приложениями, такими как текстовые процессоры, программное обес- печение CAD или редакторы XML. Преимущества могут быть в управлении транзак- циями для динамических данных, защите от внешнего интерфейса, управлении вер- сиями и возможности доступа к внешне созданным данным с помощью средств операторов SQL. Столбцы blob не могут быть проиндексированны. Тип blob не является волшебной палочкой для сохранения и поиска больших объемов файлов двоичных данных. Иногда при учете производительности накладные расходы и не- управляемость хранения нединамических объектов данных, вроде фильмов или звуков, в базе данных перевешивает преимущества, которые вы предполагали. Хранение ссылок на объекты файловой системы может быть хорошим решением.
222 Часть III. Типы данных Firebird и домены Поддерживаемые типы BLOB Firebird имеет два предварительно определенных типа blob, отличающиеся атрибутом подтипа (ключевое слово в SQL sub type), как описано в табл. 12.1. Таблица 12.1. Предварительно определенные подтипы blob Определение Алиас SQL Назначение BLOB SUB_TYPE 0 He используется Общий тип blob данных любого вида, включая текст. Общее название: "нетипизированный двоичный blob", однако Firebird ничего не знает о его содержании BLOB SUB-TYPE 1 BLOB SUB-TYPE TEXT Более специализированный подтип для хране- ния полного текста. Эквивалентен типам CLOB и мемо, реализованных в некоторых других СУБД. Рекомендуется использовать с интерфейсами приложений, таких как компоненты RAD или поисковые машины, которые выполняют спе- циальную трактовку для каждого типа Подробнее о подтипах Подтип blob является положительным или отрицательным целым, которое указывает природу данных, содержащихся в столбце. Помимо двух предопределенных типов для общего использования Firebird имеет множество подтипов, которые он применяет для внутренних целей. Все эти внутренние подтипы имеют положительные номера. Пользовательские подтипы могут быть добавлены с отличающимися идентификато- рами особых типов для объектов данных, таких как HTML, XML или текстовый про- цессор, картинки JPEG или PNG и т. д. — именно вам делать выбор. Отрицательные номера подтипов (от-1 до-32 768) резервируются для пользовательских подтипов. Система подтипов blob также позволяет выполнять специфические преобразования одного подтипа в другой. Firebird осуществляет поддержку автоматического преоб- разования между парой подтипов blob в форме въов-филътров. Фильтры blob являют- ся специальным видом внешних функций с единственным назначением: получение объекта blob одного формата и преобразование его в объект blob другого формата. Возможно создание вьов-фильтра для преобразования между пользовательским (от- рицательным) и предварительно определенным подтипами — обычно text. Объектный код для вьов-фильтров размещается в библиотеках коллективного досту- па. Фильтр, вызываемый при необходимости динамически, распознается на уровне базы данных (не сервера) при его объявлении в метаданных: DECLARE FILTER <имя~фильтра> INPUT_TYPE <подтип> /* идентифицирует тип преобразуемого объекта */ OUTPUT_TYPE <подтип> /* идентифицирует тип создаваемого объекта */ ENTRY_POINT '<имя-точки-входа>' /★ имя экспортируемой функции */ MODULE_NAME '<имя-внешней-библиотеки>'; /★ имя библиотеки BLOB-фильтра */'
Глава 12. BLOB и массивы 223 ПРИМЕЧАНИЕ. Написание и использование BLOB-фильтров выходит за преде- лы тем настоящего руководства. Информацию по этой теме можно найти в базах \ \ знаний Firebird. Firebird не проверяет тип или формат данных blob. При планировании их хранения вы должны создать такой код вашего приложения, чтобы формат данных был согла- сован с их подтипом, неважно предварительно определенным или пользовательским. Сегменты BLOB Данные blob хранятся в различных форматах в обычном столбце данных и вне столб- ца. Они хранятся в виде сегментов на одной или более страницах базы данных. Сег- менты являются дискретными фрагментами неформатированных данных, которые обычно создаются приложением в виде потока и передаются функциям API для паке- тирования и передачи по сети по одному блоку за раз непрерывно. В структуре записи ссылка на данные blob осуществляется с помощью идентифика- тора blob (blob_id). blob id является уникальной шестнадцатеричной парой, которая обеспечивает перекрестные ссылки между данными blob и содержащей их таблицей. При поступлении на сервер сегменты сохраняются в базе в том же порядке, как они были получены, хотя не обязательно с теми же размерами фрагментов, с которыми они передавались. Когда это возможно, blob сохраняются на той же странице, что и запись с остальны- ми данными. При этом большие blob могут занимать много страниц, а их начальные страницы могут содержать не данные, а массив указателей на страницы с содержи- мым blob. Примеры синтаксиса Следующий оператор определяет два столбца blob: blobi подтипа 0 (по умолчанию) и blob2 подтипа 1 (text, с набором символов по умолчанию): CREATE TABLE TABLE2 (BLOBI BLOB, /* SUB_TYPE 0 */ BLOB2 BLOB SUB_TYPE 1); Следующий оператор определяет домен, являющийся текстовым blob для хранения текстов в наборе символов ISO8859 1: CREATE DOMAIN MEMO BLOB SUB_TYPE TEXT /*BLOB SUB_TYPE 1 */ CHARACTER SET ISO8859_1; Фрагмент кода SQL показывает, как объявляется локальная переменная blob в модуле PSQL: CREATE PROCEDURE ... DECLARE VARIABLE AMEMO BLOB SUB TYPE 1;
224 Часть III. Типы данных Firebird и домены Размер сегмента Когда в таблице определяется столбец blob, определение может включать ожидаемые размеры сегментов, которые будут записываться в столбец. Значение по умолча- нию— 80 байт— совершенно случайное. Говорят, что такой размер был выбран, потому что это в точности длина строки текстового дисплея! Установка размера сегмента не влияет на производительность при обработке blob на сервере Firebird: сервер совсем его не использует. Для приложений DSQL — которые пишет большинство людей — вы можете просто игнорировать его или, если это важ- но, установите его в некоторое значение, подходящее буферу, в котором ваше при- ложение сохраняет данные blob. Для операций DML, выполняемых через API — select, insert и update — длина сег- мента указывается явно и может быть любого размера вплоть до максимума в 32 767 байт. Повторно используемые классы, драйверы и компоненты для таких сред разработки, как Delphi, C++ и Java, обычно сами заботятся о сегментации blob в их внутренних функциях и процедурах (например, в IBX и FIBPlus размер сегмента для чтения и записи blob равен 16 Кбайт и может быть изменен только глобально). Встроенные приложения В базах данных, используемых во встроенных приложениях, — здесь мы говорим о приложениях ESQL, написанных для обработки препроцессором gpre, — размер сегмента должен быть объявлен для указания максимального количества байтов, ко- торое приложение собирается записать в любой сегмент столбца. Обычно приложе- ние ESQL не должно ожидать записи сегмента, большего, чем указанная длина сег- мента, определенная в таблице; получение такого сегмента переполняет внутренний буфер сегмента и разрушает память. Полезнее указывать относительно большой сег- мент для уменьшения количества вызовов при поиске данных blob. Следующий оператор создает два столбца blob: blobi с размером сегмента по умол- чанию 80 и blob2 с заданным размером сегмента 1024: CREATE.TABLE TABLE2 (BLOBI BLOB SUB__TYPE 0, BLOB2 BLOB SEGMENT SUB_TYPE TEXT SEGMENT SIZE 1024); В следующем фрагменте кода ESQL приложение вставляет сегмент blob. Длина сег- мента указана в переменной включающего языка segment length: INSERT CURSOR BCINS VALUES (;write_segment_buffer :segment_length); Операции с полями BLOB Поле blob никогда не обновляется. Каждое обновление, которое "изменяет" blob, приводит к конструированию нового blob, создавая и новый blob id. Первоначаль- ный blob становится устаревшим, когда подтверждаются обновления. Столбец blob можно проверять на null/not null, но не существует внутренних функ- ций сравнения одного blob с другим или сравнения blob со строкой. Некоторые LJDF
Глава 12. BLOB и массивы 225 для blob, доступные на сайтах сообщества, включают сравнения двух blob на равен- ство. Невозможно выполнить конкатенацию двух blob или blob со строкой (без использо- вания сторонних Ut)F). Входная строка для столбца BLOB При получении данных для ввода столбцов blob для операций insert или update Firebird может взять строку как исходную и преобразовать ее в blob, например: INSERT INTO ATABLE (РК, ABLOB) VALUES (99, ’This is some text.*); Обратите внимание, что передача хранимой процедуре строки как входного аргумен- та, который был определен как blob, вызывает исключение. Например, следующее не будет выполнено: CREATE PROCEDURE DEMO (INPUTARG BLOB SUB_TYPE 1) AS BEGIN END л COMMIT л EXECUTE PROCEDURE DEMO('Show us what you can do with this!') л Вместо этого выполните одно из следующих: ♦ определите ваш входной аргумент как varchar, и пусть ваша процедура подстав- ляет эту строку в операторы insert или update; ♦ пусть ваша клиентская программа выполняет конвертирование строки в текст blob. Это предпочтительное решение, если длина строки не известна. Когда использовать типы BLOB blob более предпочтительны, чем символьные типы, для хранения текстовых данных неопределенно большой длины. Поскольку он преобразуется в "бессмысленные фрагменты", к нему не относится ограничение размера строк в 32 Кбайта, пока кли- ентское приложение реализует подходящие техники передачи его в требуемом серве- ром формате для его сегментирования2. Поскольку данные blob хранятся вне обычной строки данных, они не загружаются автоматически, когда выбрана строка данных. Клиент запрашивает эти данные через blob id. Следовательно, здесь имеется большой "выигрыш" по времени выборки строк с помощью select по сравнению с трафиком, когда используются строковые 2 Возможна передача строковых типов как входных данных для blob с предоставлением серверу возможности их конвертирования. При этих условиях невозможно хранение blob, который превышает ограничение для строк в 32 Кбайта. 8 Зак. 420
226 Часть III. Типы данных Firebird и домены типы для хранения больших текстовых элементов. С другой стороны, некоторые раз- работчики могут рассматривать это как недостаток, который требует дополнительной реализации "выборки по требованию". При принятии решения об использовании вьов для нетекстовых данных возникает ряд других вопросов. Удобство хранения изображений, звуковых файлов и полных документов должно быть сбалансировано с дополнительными расходами при созда- нии резервных копий базы данных. Может оказаться неразумным стремление хра- нить большое количество огромных объектов, которые никогда не будут изменяться. Безопасность Идея о том, что большие двоичные и текстовые объекты являются более защищен- ными, когда хранятся в blob, чем когда хранятся в файлах файловой системы, являет- ся в некоторой мере иллюзией. Конечно, к ним несколько сложнее получить доступ из инструментов конечного пользователя. Однако в настоящий момент привилегии базы данных не применимы к типам blob и array вне контекста таблиц, с которыми они связаны. Не будет абсурдным предположить, что "злобные хакеры", которые получают доступ к файлу базы данных, смогут написать код приложения, который будет сканировать файл в поисках blob id и читать напрямую данные из базы, как это делают внешние функции blob. Типы массивов Firebird позволяет создавать однородные массивы для большинства типов данных. Использование массива позволяет хранить множество элементов данных в виде дис- кретных, многомерных элементов в одном столбце. Firebird может выполнять опера- ции над целым массивом, эффективно трактуя его как один элемент, или он может оперировать с частью массива — подмножеством элементов массива. Часть массива может состоять из одного элемента или из набора многих смежных элементов. Типы ДЯЯДГиБОк Поскольку в Firebird не существует никакого синтаксиса динамического SQL для обработки типов array, выполнение DML и поиск таких типов из интерфейсов дина- мического SQL (DSQL) не является простым делом. API Firebird содержит структуры и функции, позволяющие динамическим приложениям работать с ними напрямую. Некоторые компоненты доступа к данным RAD (например, iBObject, использующие- ся в продуктах Borland Delphi и Kylix) содержат классы, инкапсулирующие эту функциональность API в виде свойств и методов клиентской стороны. ESQL, который не использует структуры и вызовы функций API, поддерживает неко- торый статический синтаксис SQL для обработки типов array и интеграции их с мас- сивами, объявленными во включающем языке. Для динамических и статических приложений есть подходящее, хотя и не всегда осуществимое решение: чтение данных массива в хранимой процедуре и возвраще-
Глава 12. BLOB и массивы 227 ние значений в том виде, в каком клиентское приложение может их использовать. Позже в разд. "Ограниченный доступ динамического SQL" будет приведен пример. Когда использовать тип массива Использование массивов является подходящим, когда: ♦ элементы данных естественно принимают вид множества данных одного типа; ♦ весь набор элементов данных в одном столбце базы данных должен быть пред- ставлен и должен управляться как одно целое вместо того, чтобы сохранять каж- дый элемент в отдельном столбце; ♦ к каждому элементу также должен быть индивидуальный доступ; ♦ не требуется доступ к индивидуальным значениям в триггерах или хранимых процедурах, либо у вас есть внешние функции для реализации такого доступа. Подходящие типы элементов Массивы могут содержать элементы любого поддерживаемого Firebird типа за ис- ключением blob. Массивы массивов не поддерживаются. Все элементы конкретного массива имеют один и тот же тип данных. Определение массивов Массив может быть определен как домен (с использованием create domain) или как столбец в операторе create table или alter table. Определение домена или столбца как массива похоже на определение любого другого такого объекта, здесь только добавляется указание размерности массива. Размерность массива заключается в квадратные скобки и следует за спецификацией типа данных. Например, следующий оператор определяет обычный символьный столбец и столбец в виде одноразмерного символьного массива, содержащего восемь элементов: create table atable (ID BIGINT, ARR_CHAR(14)[8] CHARACTER SET OCTETS); /* хранит 1 строку по 8 элементов */ Многомерные массивы Firebird поддерживает многомерные массивы размерностью от 1 до 16. Например, следующий оператор определяет три столбца целочисленных массивов с двумя, тре- мя и четырьмя размерностями: CREATE TABLE BTABLE ( /* хранит 4 строки по 5 элементов = 20 элементов */ ARR_INT2 INTEGER[4,5], /* 6 уровней, по 4 строки по 5 элементов = 120 элементов */ ARR_INT3 INTEGER [4,5,6],
228 Часть III. Типы данных Firebird и домены /* 7 ярусов, по 6 уровней в 4 строки по 5 элементов = 840 элементов ★/ ARR_INT6 INTEGERS, 5, 6,7] ) ; Firebird хранит многомерные массивы в порядке развертывания по строкам. В неко- торых языках, например FORTRAN, ожидается, что массивы хранятся в порядке раз- вертывания по столбцам. В таких случаях позаботьтесь о правильной трансляции порядка элементов между Firebird и используемым языком программирования. Задание диапазона значений индексов для размерностей Размерности массивов в Firebird задаются в виде верхней и нижней границ, называе- мых списком индексов. По умолчанию размерности основаны на 1 — первый элемент массива из п элементов имеет индекс 1, второй элемент имеет индекс 2, а последний элемент индекс и. Например, следующий оператор создает таблицу со столбцом, ко- торый является массивом четырех целых: CREATE TABLE TABLEC (ARR_INT INTEGER[4]); Индексы этого массива 1, 2, 3 и 4. Пользовательские (явные) границы индексов Пользовательская установка верхней и нижней границы может быть явно определена для каждой размерности массива при создании столбца array. Например, программи- сты С и Pascal, знакомые с массивами, основанными на нуле, могут создавать столб- цы массивов с нулевой нижней границей для полного соответствия со структурой массивов в коде приложения. Требуются нижняя и верхняя граница размерности при определении пользователь- ских границ. Используется следующий синтаксис: [нижняя:верхняя] Следующий пример создает таблицу с одноразмерным, основанным на нуле столб- цом массива: CREATE TABLE TABLED (ARR_INT INTEGER[0:3]); /* индексы 0, 1, 2, и 3. */ Каждое задание границ размерности отделяется от следующего запятой. Например, следующий оператор создает таблицу со столбцом массива размерности два, где обе размерности основаны на нуле: CREATE TABLE TABLEE (ARR_INT INTEGER[0:3, 0:3)); Хранение столбцов массивов Как и другие типы данных, реализованные как blob, Firebird хранит идентификатор массива в столбце таблицы базы данных, который ссылается на страницу, содержа- щую фактические данные.
Глава 12. BLOB и массивы 229 Обновления Как и в случае других типов blob, сервер Firebird не может последовательно просмат- ривать индивидуальные элементы при условном обновлении. При этом в одиночном операторе DML возможно изолировать один элемент или набор последовательных элементов, называемый фрагментом, и передавать этот фрагмент для обновления. Добавления Оператор insert не может оперировать с фрагментами. Когда строка добавляется в таблицу, содержащую столбцы массивов, необходимо конструировать и заполнять массив целиком до передачи его insert. Доступ к данным массива Некоторые интерфейсы приложений инкапсулируют функции и дескрипторы API, ограниченный доступ для чтения возможен из хранимых процедур. Дескриптор массива API предоставляет структуру дескриптора массива для передачи серверу массива или фрагмента массива для чтения и записи в базу данных. Эта структура для програм- мистов представлена в файле ibase.h (добавлены комментарии): typedef struct { short array_bound_lower; /* нижняя граница массива или фрагмента */ short array__bound_upper; /* верхняя граница массива юти фрагмента */ } ISC_ARRAY_BOUND; typedef struct { unsigned char array_desc_dtype; /* тип данных элементов */ char array_desc_scale; /* масштаб для числовых типов */ unsigned short array_desc_length; /* длина элемента массива в байтах */ char array_desc_field__name[32] ; /* идентификатор столбца */ char array_desc_relation_name[32]; /* идентификатор таблицы */ short array_dSsc_dimensions; /* количество размерностей */ short array_desc_flags; /* 0=порядок по строкам, 1=порядок по столбцам */ ISC_ARRAY_BOUND array_desc_bounds[16]; /* верхняя и нижняя границы для размерности до 16 */ } ISC_ARRAY_DESC; Документ по InterBase 6 "API Guide" (Руководство по API), опубликованный Borland, содержит детальные инструкции по манипулированию массивами с помощью струк- тур API.
230 Часть III. Типы данных Firebird и домены Ограничения доступа динамического SQL Следующий пример является простой демонстрацией того, как приложение DSQL может получить ограниченный доступ к фрагменту массива через хранимую про- цедуру: create procedure getcharslice( low_elem smallint, high_elem smallint) returns (id integer, list varchar(50)) as declare variable i smallint; declare variable string varchar(lO); begin for select al.ID from ARRAYS al into :id do begin i= low_elem; list = ''; while (i <= high_elem) do begin select a2.CHARARRAY[:i] from arrays a2 where a2.ID = :id into :string; list = list||string; if (i < high_elem) then list = list I|','; i = i + 1; end suspend; end end Пора дальше Последняя глава этой части книги описывает, как объединить тип данных и его до- полнительные атрибуты в домен, который вы можете использовать для определения типов данных в столбцах различных таблиц.
ГЛАВА 13 Домены Домены в Firebird сродни концепции "типы данных, определенные пользователем". Хотя и невозможно создать новый тип данных, в домене вы можете "упаковать" на- бор атрибутов с одним из существующих типов данных, присвоить ему идентифика- тор и после этого использовать его как параметр типа данных для определения столбцов любой таблицы. Определения доменов являются глобальными для базы данных — все столбцы в лю- бой таблице, которые были определены с одним доменом, будут иметь совершенно идентичные атрибуты за исключением тех, которые были локально переопределены. Как было отмечено, домены не могут быть подставлены вместо типов данных при определении аргументов и переменных в хранимых процедурах и триггерах. ПРИМЕЧАНИЕ. Замещение атрибутов домена на уровне столбца обсуждается позже в этой главе. Столбцы, основанные на определении домена, наследуют все атрибуты домена, ко- торые могут быть: ♦ типом данных (обязательно); ♦ значением по умолчанию для insert; ♦ состоянием null; ♦ ограничениями check; ♦ набором символов (только для символьных и blob столбцов); ♦ порядком сортировки (только для символьных столбцов). | ПРИМЕЧАНИЕ. Вы не можете использовать ограничения ссылочной целостно- \ сти данных в домене. Преимущества инкапсуляции определения данных очевидны. Для простого, но обще- го примера предположим, что вы проектируете обращения к множеству малых таб- лиц, где вы собираетесь хранить текстовые описания пронумерованных множеств — таблицы "типов" — типы счетов, типы продуктов, типы пожертвований и т. д. Вы
232 Часть III. Типы данных Firebird и домены принимаете решение, что каждый элемент каждого из этих множеств будет иметь ключ, состоящий из трех символов в верхнем регистре, который указывает на сим- вольное описание или поле заголовка, имеющее максимум 25 символов. Все это требует создания двух доменов. ♦ Домен для указателя будет снак(З) с двумя дополнительными атрибутами: огра- ничение not null, поскольку вы собираетесь его использовать в качестве первич- ного ключа и ключа поиска, и ограничение check для проверки наличия пропис- ных букв. Например: CREATE DOMAIN Туре_Кеу AS CHAR(3) NOT NULL CHECK (VALUE = UPPER (VALUE)); ♦ Домен описания будет varchar(25). Вы хотите запретить для него пустые значе- ния, поскольку таблицы, в которых вы собираетесь его использовать, являются управляющими: CREATE DOMAIN Type_Description AS VARCHAR(25) NOT NULL; Когда вы создадите эти домены, все ваши взаимосвязанные таблицы могут иметь похожие определения, а все таблицы, хранящие ключи, ссылающиеся на такие таб- лицы, будут использовать соответствующий домен для столбцов ключа. Создание домена Синтаксис языка определения данных (DDL) для создания домена: CREATE DOMAIN домен [AS] <тип-данных> [DEFAULT литерал [NULL |USER}] [NOT NULL] [CHECK (<условие-поиска-домена>)] [CHARSET набор-символов\ NONE}] [COLLATE порядок-сортировки]; Идентификатор домена При создании в базе данных домена вы должны задать идентификатор домена, кото- рый является глобально уникальным в базе данных. Разработчики часто используют префикс или суффикс в идентификаторах доменов для улучшения документирова- ния. Например: CREATE DOMAIN D_TYPE_IDENTIFIER... CREATE DOMAIN DESCRIPTION^. . . Тип данных домена Tun данных является единственным обязательным атрибутом, который должен быть установлен для домена — все другие атрибуты необязательны. Он задает тип данных SQL, который будет применен для столбца, определенного с использованием этого
Глава 13. Домены 233 домена. Может быть применен любой тип данных Firebird. Нельзя использовать до- мен как тип данных для другого домена. Следующий оператор создает домен, определяющий массив символьного типа: CREATE DOMAIN DEPTARRAY AS CHAR(31) [4:5]; Следующий оператор создает домен blob текстового подтипа, которому назначен набор символов, перекрывающий набор символов базы данных по умолчанию. Фак- тически он создает специализированный тип примечания для хранения текста на японском языке: CREATE DOMAIN DESCRIPT_JP AS BLOB SUBJTYPE TEXT CHARACTER SET SJIS; Атрибут DEFAULT Домен может определять значение по умолчанию, которое сервер будет использовать при добавлении новой строки, если оператор insert не содержит этот столбец в списке столбцов. Значения по умолчанию могут сэкономить время и избавить от ошибок в процессе ввода данных. Например, для столбца date возможным значением по умолчанию может быть текущая дата, а для столбца userName (имя пользователя) можно указать контекстную переменную currentjjser. Значение по умолчанию может быть: ♦ константой. Значением по умолчанию является заданная пользователем строка, числовое значение или значение даты — часто используется для помещения "ну- левого значения" в столбец, куда не могут помещаться пустые значения (null); ♦ current_timestamp, current.date, current_time или предварительно определенный литерал даты Firebird (см. главу 10)', ♦ user, current_user или current_role (если применяются роли); ♦ CURRENT_CONNECTION ИЛИ CURRENT_TRANSACTION. < ПРИМЕЧАНИЕ. Возможно указание в качестве значения по умолчанию null. Хотя это излишне, поскольку столбцы, допускающие пустое значение, в любом \___\ случае инициализируются по умолчанию значением null. Более того, явное ука- зание значения по умолчанию null может привести к конфликтам, если столбец, использующий домен, должен быть определен с ограничением not null (cm. разд. "Атрибут NOT NULL" далее в этой главе). Следующий оператор создает домен, который должен иметь положительное значение больше 1000. Если в операторе insert не указан столбец, созданный на основе этого домена, столбцу будет назначено значение по умолчанию 9999: CREATE DOMAIN CUSTNO AS INTEGER DEFAULT 9999 CHECK (VALUE > 1000);
234 Часть III. Типы данных Firebird и домены Если ваша операционная система поддерживает использование многобайтовых сим- волов в именах пользователей или если вы используете многобайтовый набор симво- лов при определении роли, то каждый столбец, в котором должно сохраняться такое значение по умолчанию, должен быть определен с использованием подходящего на- бора символов. Когда значения по умолчанию не работают Распространенная ошибка предполагать, что значение по умолчанию будет исполь- зовано, когда Firebird получает значение null в столбце, имеющем значение по умол- чанию. Чтобы быть уверенным в правильном использовании значений по умолча- нию, нужно понимать, что значение по умолчанию будет применено: ♦ только при добавлении новой строки; ♦ только если оператор insert не включает столбец со значением по умолчанию в списке столбцов. Если ваше приложение содержит столбец, имеющий значение по умолчанию, в опе- раторе insert и передает null в списке значений, то будет сохра