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

Борри Хелен

Рассмотрены вопросы, необходимые разработчику для создания клиент-серверных приложений с использованием СУБД Firebird, явившейся развитием СУБД Borland Interbase 6. Содержится обзор концепций и моделей архитектуры клиент/сервер, а также практические рекомендации по работе с клиентскими библиотеками Firebird. Детально описаны особенности типов данных SQL, язык манипулирования данными (Data Manipulation Language, DML), а также синтаксис и операторы языка определения данных ( Data Definition Language, DDL). Большое внимание уделено описанию транзакций и приведены советы по их использованию при разработке приложений. Описано программирование на стороне клиента и сервера написание триггеров и хранимых процедур, создание и использование событий базы данных, обработка ошибок в коде на сервере и многое другое. Материал сопровождается многочисленными примерами, советами и практическими рекомендациями.

Для разработчиков баз данных

Хелен Борри

Firebird

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

Введение

Об авторе

Хелен Борри (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 и не откажется при удобном случае посетить Австралию.

Благодарности

Вот, наконец, мы с книгой по 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) и Иоане Пирте (Ioana Pirtea) за их просмотр "читательскими глазами".

Я также благодарна директорам компании IBPhoenix Полу Бигу (Paul Beach) и Анне Харрисон, а также моим сотрудникам за то, что помогли мне в вопросах временных задержек и финансирования книги.

Предложения по книге о Firebird на английском языке получали в издательствах отказ на протяжении более трех лет, пока Apress не взяла на себя риск и не выпустила в свет книгу по Firebird. Apress, сообщество Firebird благодарит вас за то, что услышали нас.

Введение в 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. В этой части вводятся различные инструменты командной строки для администратора и рассказывается, как запустить и остановить сервер.

Часть II содержит обзор концепций и моделей архитектуры клиент-сервер и описание того, насколько им соответствует реализация Firebird. Финальная глава этой части содержит некоторые общие практические инструкции по использованию клиентских библиотек Firebird.

В части III вы найдете детальное описание каждого типа данных SQL, поддерживаемого Firebird. Существует отдельная глава для каждого класса типа данных - числа, тип дата/время, символьные типы и т.д. - с множеством советов по их использованию.

Часть IV исследует объекты базы данных в подробностях, начиная с самой базы данных и переходя к таблицам, индексам и другим типам объектов. Синтаксис и использование операторов языка определения данных (Data Definition Language, DDL) представлены в этой части.

Часть V содержит документацию по языку манипулирования данными (Data Manipulation Language, DML), используемому в SQL Firebird.

Приложения и глоссарий

В приложениях и глоссарии представлены следующие материалы и детали.

Приложение 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.

Происхождение Firebird

Созданный как проект с открытыми исходными кодами, Firebird является первым в новом поколении потомков InterBase 6.0 Open Edition фирмы Borland, который был сформирован для разработки открытых исходных кодов в июле 2000 г. в рамках InterBase Public License (IPL).

Исходные коды Firebird поддерживаются и развиваются на основании международного открытого кода на сайте SourceForge.net (http://sourceforge.net), большой группой профессиональных разработчиков, в которую входят добровольцы и наемные специалисты, получающие частичное финансирование из сообщества и коммерческих источников.

! ! !

СОВЕТ. Продукты реляционной СУБД Firebird и некоторые связанные модули распространяются полностью свободными от регистрации или гонорара на основании универсальной лицензии на открытые коды. Проект Firebird, его разработчики и его программное обеспечение никак не связаны с Borland Software Corporation.

ЧАСТЬ I. Учебный лагерь.

ГЛАВА 1. Инсталляция.

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

Удаленным клиентам не требуется сервер Firebird вовсе. Процедура инсталляции клиента Firebird несколько изменяется в зависимости от платформы (см. разд. "Инсталляция клиентов" в главе 7). Если вы в Firebird новичок, не пытайтесь устанавливать только клиента, пока не разберетесь, как все части инсталляции по умолчанию соответствуют друг другу.

Системные требования

Память на сервере (все платформы)

Оценка памяти сервера включает множество факторов.

* Работа сервера Firebird. Сервер Firebird осуществляет эффективное использование ресурсов сервера. Суперсервер (Superserver) после старта использует приблизительно 2 Мбайта памяти. Классический сервер (Classic server) в POSIX не использует памяти, пока не установлено клиентское соединение. В Windows небольшие сервисы прослушивают запросы на соединения.

* Клиентские соединения. Каждое соединение с Суперсервером добавляет приблизительно 115 Кбайт, больше или меньше, в соответствии со стилем и характеристиками клиентских приложений, а также спроектированной схемой базы данных. Каждое соединение с Классическим сервером использует приблизительно 2 Мбайта (в зависимости от количества применяемых соединением таблиц, триггеров, процедур и других объектов - может быть и до 30-40 Мбайт. Для баз данных среднего размера - от 4 до 15 Мбайт).

* Кэш базы данных. Значение по умолчанию может конфигурироваться - в страницах базы данных. Суперсервер использует единый кэш (с размером по умолчанию 2048 страниц) для всех соединений и автоматически увеличивает кэш при необходимости. Классический сервер создает индивидуальный кэш (по умолчанию 75 страниц) на каждое соединение.

На основании существующих оценок отводите 64 Мбайта RAM для сервера и 16 Мбайт для локального клиента. Чем больше клиентов вы добавляете, тем больше памяти будет использовано. Базы данных с большим размером страниц используют ресурсы из большего участка памяти, чем базы данных с меньшим размером страниц. Использование ресурсов для Классического сервера увеличивается линейно с каждым новым подключением клиента; для Суперсервера ресурсы разделяются между несколькими подключениями, и будут динамически увеличиваться при необходимости. Firebird 1.5 будет использовать для сортировки, если она необходима, дополнительную RAM. Использование памяти более подробно обсуждается в главе 6.

Инсталляционные диски

Сервер Firebird - и любые базы данных, которые вы создаете или с которыми соединяетесь, - должны находиться на жестком диске, который физически подключен к машине. Вы не можете разместить компоненты сервера или любой базы данных на назначенном диске, в разделяемой файловой системе или в сетевой файловой системе.

Вы не можете запускать сервер Firebird с CD-ROM. При этом вы можете соединяться с базой данных только для чтения, находящейся на устройстве CD-ROM, физически подключенным к серверу

[2]

.

Минимальные требования к машине

Минимальные требования зависят от того, как вы планируете использовать систему. Вы можете запустить сервер и разрабатывать схемы баз данных на персональном компьютере с минимальной конфигурацией- даже на "быстром" 486 или на Pentium II с 64 Мбайт RAM будет работать Firebird 1.0.x- но такая конфигурация не позволит использовать многие возможности при работе в сети. Для версии 1.5 и более поздних процессор 586 с 128 Мбайт RAM может рассматриваться как минимум. Windows более требовательна к CPU и оперативной памяти, чем Linux, в которой запускается сервер на консольном уровне. Версии операционной системы влияют на требования: некоторые платформы UNIX требуют больше ресурсов как для сервера, так и для клиента, а требования некоторых версий Windows неприменимы к указанным характеристикам, независимо от требований программного обеспечения.

Суперсервер и Классический сервер Firebird могут использовать разделяемую память мультипроцессоров в Linux. В Windows поддержка SMP (симметричный мультипроцессор) доступна только для Классического сервера.

Технология HyperThreading ненадежна, похоже, она зависит от нескольких условий, включая платформу операционной системы, поставщика оборудования и версию сервера. Некоторые пользователи сообщают об успешном использовании, другие имеют проблемы. Если у вас есть машина с такими возможностями, проверьте вначале выбранный вами сервер на эту возможность и будьте готовы отменить ее на уровне BIOS, если увидите замедление в работе.

Как получить инсталляционный комплект

Комплект Firebird можно найти на главном сайте Firebird (http://www.firebirdsql.org) или на сайте SourceForge (http://firebird.sourceforge.net). Ссылки на этих страницах приведут вас к: http://sourceforge.net/project/showfiles.php?group_id=9028.

Главная страница на сайте Firebird обычно содержит список ссылок на последние релизы для Linux и Windows. Другие ссылки будут указывать на дистрибутивы для других платформ. Если файл в своем имени содержит "src", то это созданный исходный код, а не инсталляционный пакет. Дистрибутивы, имеющие в своем имени "debug", "debuginfo" или "pdb", содержат специальные файлы для анализа и отладки сбоев сервера или клиента с помощью сред разработки и не требуются для обычной работы.

Содержание комплекта

Каждый инсталляционный комплект содержит все компоненты, нужные для инсталляции Firebird.

* Исполняемая программа сервера Firebird.

* Множество других программ, нужных при инсталляции и/или во время выполнения задач.

* Скрипты командной строки или командные файлы, нужные при инсталляции, которые также могут использоваться как утилиты сервера.

* Файл безопасности баз данных (isc4.gdb для версии 1.0.x; security.fdb для версии 1.5).

Соглашения по именованию в комплекте инсталляции

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

Обычно первой частью имени является строка "Firebird".

* Если релиз для Windows поддерживает Классический сервер, он будет включен в тот же инсталлятор, что и Суперсервер.

Зеркальные сайты

Когда вы найдете требуемый комплект поставки, щелкните мышью по гиперссылке - имени файла. Вы перейдете на список зеркальных сайтов, как показано на рис. 1.1.

Не имеет значения, какой зеркальный сайт вы выберете - комплект поставки идентичен для всех сайтов.

Комплект поставки для Linux

Прокручивайте отображаемый в SourceForge список файлов, пока не увидите файлы, показанные на рис. 1.2.

Здесь представлены реальные исполняемые инсталляторы. Доступны инсталляторы RPM и инсталляторы сжатых файлов (TAR-файлы). Если ваш дистрибутив Linux поддерживает инсталляторы RPM, выберите именно его. Он создаст каталоги и установит все необходимое, определит пароль для пользователя SYSDBA и запустит выбранный вами сервер. Инсталляторы имеют следующие имена:

* Firebird 1.5 - FirebirdCS-1.5.2.4731-0.i686.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).

ГЛАВА 2. Установка сети.

Поскольку реляционная система управления базами данных (РСУБД) специально создана для платформы клиент-сервер, Firebird позволяет удаленным и локальным клиентам одновременно соединяться с сервером, используя различные сетевые протоколы.

Инсталлятор создаст конфигурацию по умолчанию для соединения клиента с сервером и для получения соединений от клиентов с использованием установок порта по умолчанию. Если только не существует внешних причин создавать пользовательскую конфигурацию сети, то нет необходимости для запуска Firebird изменять конфигурацию, которая была установлена при инсталляции.

Сетевые протоколы

Firebird поддерживает протокол TCP/IP для всех комбинаций клиентских и серверных платформ.

Именованные каналы

Firebird поддерживает протокол Мiсrоsоft WNet Named Pipes для серверов Windows NT/2000, XP и клиентов Windows. Имя канала по умолчанию interbas. Windows 9х и ME не Moryт быть серверами WNet.

! ! !

ПРИМЕЧАНИЕ. Протокол Windows Named Pipes (именованные каналы) часто называют NetBEUI. Строго говоря, NetBEUI является транспортной частью, используемой в WNet.

. ! .

Локальный доступ

Хотя Firebird разработан, чтобы быть сервером базы данных для удаленных клиентов, он предоставляет множество средств локального доступа.

Firebird поддерживает протокол Microsoft WNet Named Pipes для серверов Windows NT/2000, XP и клиентов Windows. Имя канала по умолчанию interbas. Windows 9х и ME не могут быть серверами WNet.

Клиент-сервер

Средства локального доступа.

* Локальная заглушка TCP/IP. Для многоуровневых серверных приложений и других клиентов доступ к локальному серверу на любой поддерживаемой платформе осуществляется через протокол TCP/IP: даже при отсутствии сетевой карты соединение может быть выполнено через специальный сервер localhost с IP-адресом 127.0.0.1.

! ! !

ВНИМАНИЕ! Соединение с localhost невозможно для приложений встраиваемого сервера.

Встраиваемый сервер

Начиная с Firebird 1.5, пакеты Firebird для Windows включают полную функциональность встраиваемого сервера (клиент и сервер соединяются как динамическая библиотека). Это идентично обычной модели клиент-сервер, за исключением того, что здесь не поддерживается сетевой протокол: соединение осуществляется в стиле "локальной Windows" для эмуляции сетевого соединения.

! ! !

ВНИМАНИЕ! Встраиваемый сервер не поддерживает пароль безопасности доступа Firebird.

. ! .

ГЛАВА 3. Конфигурирование Firebird.

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

Тем не менее, это заявление может оказаться не совсем верным для некоторых платформ, или когда определенная операционная система заблокировала одну или две функции автоматического конфигурирования инсталляционного скрипта или программы. Данная глава будет интересна новым пользователям при решении некоторых из этих проблем.

В первом разделе главы указано, как конфигурировать переменные окружения и ресурсы файловой системы для использования Firebird. Здесь описывается проверка параметров конфигурации сервера, как их модифицировать в случае особого использования и требований совместимости.

Конфигурация на уровне базы данных

Эта глава посвящена конфигурации на уровне сервера. Один сервер Firebird может работать с несколькими базами данных одновременно. Каждая база данных может быть сконфигурирована таким образом, чтобы соответствовать предъявляемым к ней требованиям. Конфигурирование на уровне базы данных см. в главах 15 и 39.

Переменные окружения

Переменные окружения - глобальные установки системы, которые используются при первоначальной загрузке операционной системы. В Windows, Linux и в большинстве систем UNIX сервер Firebird распознает и использует некоторые переменные окружения, если они установлены. Процессы fbserver (архитектура Суперсервера) и fb inet server (архитектура Классического сервера) не распознают установок, которые ссылаются на сетевые ресурсы (диски и файловые системы), не управляемые физически серверной машиной.

ГЛАВА 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 Manager может быть использована из командной строки для запуска и остановки процесса вручную.

Если вы по разным причинам запустили Firebird вручную, соединитесь с ним как пользователь root или firebird. Запомните, какую учетную запись вы использовали при запуске fbserver, потому что все созданные объекты будут принадлежать пользователю с этой учетной записью. Если позже другой пользователь запустит процесс с использованием другой учетной записи пользователя, то эти объекты будут ему недоступны.

Настоятельно рекомендуется создать системного пользователя с именем firebird и запускать сервер Firebird с этой учетной записью.

Классический сервер

Классический сервер Firebird использует процессы xinetd или inetd для обработки поступающих запросов. (Применяемый процесс зависит от версии Linux.) Нет необходимости явно запускать сервер. Процесс xinetd или inetd запускается автоматически; когда он получает запрос от клиента Firebird на соединение, он порождает копию процесса fbinetserver для этого клиента.

Если Классический сервер Firebird был установлен инсталлятором, использующим скрипты или RPM, то файл конфигурации запуска для fb inet server с именем firebird должен быть добавлен в сервисы, о которых знает [x]inetd. В большинстве дистрибутивов Linux этот файл размещается в каталоге /etc/xinetd.d. Чтобы [x]inetd "слушал" запросы на соединение от клиентов для вашего Классического сервера Firebird, скрипт firebird должен находиться в том же каталоге, где стартует процесс [x]inetd.

Запуск сервера 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 и XP Home Edition Firebird может выполняться только как приложение. Если Firebird выполняется как приложение, на панели задач появляется соответствующая иконка. Некоторые задачи администрирования могут быть выполнены вручную при щелчке правой кнопкой мыши на этой иконке.

Выполнение Firebird как сервиса в Windows NT, 2000 и XP

Если данный компьютер используется как сервер БД, то вам настоятельно рекомендуется выполнять сервер Firebird как сервис.

! ! !

ПРИМЕЧАНИЕ. Пользователи, выполняющие миграцию с InterBase 6.0 или более раннего, должны обратить внимание, что не требуется выполнения Firebird как приложения на хост-машинах SMP, чтобы установить наличие только одного процессора. Опция сервиса Firebird по использованию количества процессоров содержится в файле конфигурации. Более подробную информацию см. в разд. "Файл конфигурации Firebird" главы 36.

. ! .

Апплеты Firebird Manager

Когда Firebird выполняется как сервис, небольшое количество административных задач, включая останов и рестарт, может быть решено с использованием апплета Firebird Manager на Панели управления. Самый простой апплет инсталлируется при установке Firebird. Более сложные апплеты, включая версии языков, можно загрузить из Firebird CVS с сайта SourceForge или с различных сайтов, связанных с Firebird.

Выполнение Firebird как приложения на платформах Windows

Если сервер Firebird выполняется как приложение, вы должны увидеть иконку в системной области на серверной машине, как показано на рис. 4.1. Вид иконки в системной области зависит от того, запущен ли только сервер, или вы управляете его выполнением с помощью Guardian. Рекомендуется использовать Guardian при выполнении Суперсервера как приложения и исключить его при выполнении Классического сервера.

Рис. 4.1. Иконка на системной панели

Вы не увидите иконку, если сервер не был запущен (в случае Суперсервера) или не был инициализирован (в случае Классического сервера). Пока вы не установите режим автоматического запуска сервера, вам будет нужно стартовать или инициализировать его вручную.

Алиасы базы данных

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

aliases.conf

Средство алиасов включает файл конфигурации aliases.conf. Он находится в корневом каталоге вашей инсталляции сервера и не должен перемещаться оттуда.

Переносимость

До реализации 1.5 все клиентские приложения соединялись с сервером, используя строку соединения, которая включала абсолютный путь к серверу. Формат абсолютного пути меняется в зависимости от того, выполняется ли сервер под Windows или на POSlX-совместимой платформе (Linux, UNIX и т.д.), а для серверов под Windows еще и от того, какой вид сетевого соединения используют клиенты - TCP/IP или NetBEUI.

Предположим, у вашего сервера имя hotchicken. Если сервер выполняется на POSIX- совместимой платформе; клиенты TCP/IP будут соединяться с базами данных, используя строку соединения следующего формата:

hotchicken:/opt/databases/Employee.fdb

Если же сервер работает под Windows, клиенты TCP/IP должны соединяться, используя другой формат пути:

hotchicken:D:\databases\Employee.fdb

Управление доступом

Основное преимущество средства алиасов в том, что оно может быть использовано в комбинации с параметром DatabaseAccess = NONE из файла firebird.conf для ограничения доступа к файлам баз данных - доступ разрешен только к файлам, указанным в aliases.conf.

Алиасы баз данных появились в Firebird 1.5. Для их использования отредактируйте файл aliases.conf в корневом каталоге инсталляции Firebird, используя текстовый редактор, такой как Блокнот (в Windows) или V1 (Linux).

Инсталлированный файл aliases.conf выглядит приблизительно таким образом:

ЧАСТЬ II. Клиент-сервер.

ГЛАВА 5. Введение в архитектуру клиент-сервер.

Обычно система клиент-сервер является парой программных модулей, разработанных для связи друг с другом через сеть посредством согласованного протокола. Клиентский модуль отправляет запросы через сеть слушающей программе сервера, а сервер отвечает на запросы.

Например, клиент электронной почты направляет сообщение по сети на почтовый сервер с требованием к серверу перенаправить это сообщение по адресу какого-то сервера. Если запрос соответствует принятому протоколу и адрес назначения является действительным, сервер реагирует, перенаправляя сообщение и возвращая клиенту подтверждение.

Ключевой принцип в том, что задача расщепляется - или распределяется - между двумя программными компонентами, которые выполняются независимо на двух физически разделенных компьютерах. Эта модель даже не требует, чтобы компоненты выполнялись в совместимых операционных или файловых системах. Клиент электронной почты должен быть почтовой клиентской программой, которая выполняется под Windows, Mac или любой другой операционной системой, а почтовый сервер обычно выполняется в системах UNIX или Linux. Клиентская и серверная программы способны успешно взаимодействовать, поскольку они были спроектированы функционально совместимыми.

В системе клиент-серверной базы данных модель идентична. На хост-машине в сети выполняется программа, которая управляет базами данных и клиентскими соединениями - сервер базы данных. Он расположен на узле сети, который известен клиентским программам, выполняющимся в других узлах сети. Сервер слушает запросы из сети от клиентов, которые хотят соединиться с базой данных, а также от других клиентов, которые уже соединены с базами данных.

В примере с электронной почтой протокол коммуникации имеет два уровня. Как и система электронной почты, система баз данных клиент-сервер использует стандартный сетевой протокол и перекрывает его другими протоколами специального назначения. Для электронной почты перекрытие (overlay) будет POP3, IMAP и SMTP; для системы базы данных это протоколы соединения с базой данных, безопасности, переноса данных и языка.

ГЛАВА 6. Сервер Firebird.

Сервер Firebird - это программа, которая выполняется на узле хоста в сети, и слушает клиентов с порта коммуникации. Она обслуживает запросы множества клиентов к множеству баз данных. Суперсервер (Superserver) является многопоточным процессом, который запускает новый поток для каждого соединившегося клиента. В модели Классического сервера (Classic server) новый процесс запускается для каждого соединения.

Серверы Firebird могут выполняться почти на любом оборудовании персональных компьютеров и принимать клиентские соединения от приложений, выполняющихся в совершенно других операционных системах. С одной стороны, небольшой и легкий дистрибутив сервера может быть установлен на устаревшем оборудовании, даже для старых процессоров Pentium в операционной системе Windows 95 или в минимальных системах Linux. С другой стороны, серверы Firebird выполняются на распределенном оборудовании, управляя базами данных размерами в терабайты

[8]

.

Конечно, нереально планировать информационную систему предприятия, выполняющуюся под Windows 95. Тем не менее проще простого запустить минимально сконфигурированный сервер, а по необходимости в дальнейшем масштабировать его как по вертикали, так и по горизонтали. Серверы Firebird существуют в двух вариантах - Суперсервер и Классический сервер для удовлетворения различных потребностей пользователя. Оба могут быть масштабированы как вверх, так и вниз для обработки от самых простых до наиболее сложных конфигураций.

Программное обеспечение сервера Firebird эффективно использует системные ресурсы хост-компьютера. Суперсервер использует приблизительно 2 Мбайта памяти. Каждое клиентское соединение Суперсервера добавляет примерно 115 Кбайт к используемой сервером памяти - меньше или больше в зависимости от характеристик приложений клиента и способа проектирования базы данных. Каждое соединение Классического сервера запускает собственный серверный процесс, требующий приблизительно 2 Мбайта памяти.

Требуемая серверу кэш-память зависит от конфигурации и от выбранного варианта Firebird. Обычная конфигурация кэша для сети при одновременно работающих 20-40 пользователях, скорее всего, будет 16, 32 или 64 Мбайта для Суперсервера, использующего общий пул для всех соединений. Для каждого Классического сервера назначается статический кэш с размером по умолчанию 75 Кбайт. Серверы версии 1.5 также будут использовать RAM для ускорения сортировки, если память доступна. Требуемое дисковое пространство для минимальной инсталляции Firebird составляет от 9 до 12 Мбайт в зависимости от платформы. Дополнительное дисковое пространство требуется для временного хранения данных в процессе выполнения операций, дополнительная память также требуется для кэширования страниц базы данных. Эта память конфигурируется в соответствии с запросами обработки данных и вероятного объема и типа обрабатываемых данных.

ГЛАВА 7. Клиенты Firebird.

Клиенту на удаленной рабочей станции требуется клиентская библиотека и приложение (программа), которое может взаимодействовать с интерфейсом прикладного программирования (Application Programming Interface, API), объявленным в этой библиотеке.

Клиентская библиотека предоставляет протокол соединения и транспортный уровень, которые ваше клиентское приложение использует для связи с сервером. Стандартная библиотека для клиентов Windows - это Windows DLL. Для клиентов POSIX это совместно используемый объект (библиотека SO). Размер стандартной клиентской библиотеки приблизительно 350 Кбайт.

Некоторые уровни доступа, как, например провайдер Firebird .NET и драйверы JayBird Java, не требуют наличия клиентской библиотеки и напрямую реализуют сетевой протокол. Еще один режим существует во встраиваемом сервере - библиотека, которая объединяет клиентский и серверный экземпляры для использования одним пользователем.

Клиентская рабочая станция также может иметь копию текущего файла firebird.msg или его локализованную версию для того, чтобы отображались корректные сообщения сервера.

Обычно вы будете инсталлировать копию клиентской библиотеки на сервере для использования с некоторыми утилитами командной строки Firebird и/или для различных программ управления, выполняющихся на сервере, которые вы могли бы использовать. Тем не менее многие из этих утилит могут запускаться удаленно. Администратор системы может управлять некоторыми из основных сервисов, предоставляемыми этими утилитами для доступа к ним, через интерфейс управления услугами на хосте.

ЧАСТЬ III. Типы данных Firebird и домены

ГЛАВА 8. О типах данных Firebird.

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

Firebird поддерживает большую часть типов данных SQL. В дополнение он поддерживает динамически изменяемые типизированные и не типизированные большие двоичные объекты (Binary Large Object, BLOB) и многомерные однородные массивы для большинства типов данных.

Где задаются типы данных

Тип данных определяется для элементов данных в следующих ситуациях:

* при определении столбца в операторе CREATE TABLE;

* при создании шаблона глобально используемого столбца посредством CREATE DOMAIN;

* при изменении шаблона глобально используемого столбца с применением ALTER DOMAIN;

* при добавлении нового столбца в таблицу или при изменении столбца с использованием ALTER TABLE;

Поддерживаемые типы данных

Числовые типы данных (обсуждаемые в главе 9) следующие:

* BIGINT, INTEGER и SMALLINT;

* NUMERIC и DECIMAL;

* FLOAT и DOUBLE PRECISION.

Типы данных даты и времени (обсуждаемые в главе 10):

Булевы типы данных

Firebird 1.5 и выше не поддерживает булевы (логические) типы данных. Обычной практикой является объявление односимвольного или SMALLINT домена для общего использования, где требуются булевы типы данных.

Советы по определению булевых доменов см. в главе 13.

ГЛАВА 9. Числовые типы данных.

Firebird поддерживает числовые типы данных с фиксированной точкой (точные числа) и с плавающей точкой (приблизительная точность). Десятичными типами с фиксированной точкой являются целые типы с нулевым масштабом SMALLINT, INTEGER и в диалекте 3 BIGINT, а также два почти одинаковых масштабируемых числовых типа: NUMERIC и DECIMAL. Два типа с плавающей точкой: FLOAT (низкая точность) и DOUBLE PRECISION

[15]

.

Firebird не поддерживает беззнаковый целочисленный тип. В табл. 9.1 показаны диапазоны значений каждого числового типа в Firebird.

Таблица 9.1. Границы числовых типов Firebird

* Границы для типов NUMERIC и DECIMAL изменяются в зависимости от способа хранения и масштаба. Границы всегда будут соответствовать тому типу, в котором эти данные будут сохраняться

[16]

.

ГЛАВА 10. Типы даты и времени.

Firebird поддерживает в диалекте 3 типы данных DATE, TIME и TIMESTAMP. В диалекте 1 поддерживается только один тип данных, подобный TIMESTAMP, который, хотя и называется DATE, не является взаимозаменяемым с типом DATE диалекта 3.

DATE

В диалекте 3 DATE хранит одну дату без времени - тип "только дата" - в виде 32-битового знакового целого. Хранимый диапазон дат от 1 января 0001 года до 31 декабря 9999 года

[24]

.

В диалекте 1 тип DATE эквивалентен типу TIMESTAMP диалекта 3. Действительно, когда вы создаете новый столбец даты в базе данных диалекта 1 с использованием isql, появляется предупреждение, информирующее вас, что тип данных был переименован! SQLTYPE будет иметь тип ISC_TIMESTAMP.

Не существует типа "только дата" в диалекте 1. Для сохранения в диалекте 1 только даты, передайте правильное значение даты и литерал времени в виде "00:00:00.0000". Литералы даты и времени обсуждаются более подробно в следующих разделах.

! ! !

TIMESTAMP

Тип данных TIMESTAMP диалекта 3 состоит из двух 32-битовых слов, хранящих дату и время. Данные хранятся как два 32-битовых целых, что эквивалентно типу DATE в диалекте 1.

Доли секунды

Доли секунды, если хранятся, являются десятитысячными долями секунды для всех типов даты и времени.

TIME

В диалекте 3 TIME хранит время дня без даты: "только время". Для хранения используется 32-битовое беззнаковое целое. Диапазон времени от 00:00 до 23:59:59.9999.

В диалекте 1 нет эквивалента типу TIME. Если нужно сохранить время дня, выделите элементы часов, минут и секунд из данных DATE и преобразуйте в строку. Технические советы есть дальше в этой главе - обратитесь к разд. "Комбинирование EXTRACT() с другими функциями".

Интервал времени

Ошибочно предполагать, что тип TIME может хранить интервал времени. Он не может. Для вычисления интервала времени вычтите более позднюю дату или время из более раннего. Результатом будет число NUMERIC(18,9), выражающее интервал в днях. Поскольку точность теряется, доли секунд надо рассматривать как миллисекунды, а не десятитысячные доли секунд. Используйте обычные арифметические операции для конвертирования дней в часы, минуты или секунды, как вам требуется.

Предположим, что столбцы STARTED и FINISHED имеют тип TIMESTAMP (DATE В диалекте 1). Для вычисления и сохранения в столбце TIME_ELAPSED типа DOUBLE PRECISION интервала времени в минутах вы можете использовать следующее

[25]

:

UPDATE ATABLE

SET TIME_ELAPSED = (FINISHED - STARTED) * 24 * 60

Литералы даты

Литералы даты являются "читаемыми человеком" строками, заключенными в апострофы. Их сервер Firebird распознает как константы даты или даты-и-времени для EXTRACT и других выражений, операций INSERT и UPDATE, а также в предложении WHERE оператора SELECT.

Литералы даты используются, когда нужно передать константы даты:

* операторам SELECT, UPDATE и DELETE в условия поиска предложения WHERE;

* операторам INSERT и UPDATE для ввода констант даты и времени;

* аргументу FROM функции EXTRACT().

ГЛАВА 11. Символьные типы данных.

Firebird поддерживает символьные (строковые) типы данных фиксированной и переменной длины. Они могут быть определены для локального использования в любом наборе символов, выбираемом из большого списка. Символьные типы фиксированной длины не могут превышать 32 767 байт абсолютной длины; для типов переменной длины этот предел уменьшается на два байта, которые при сохранении строки содержат счетчик символов.

Firebird хранит строки очень экономно, используя простой алгоритм сжатия данных, даже если это тип CHAR или NCHAR. В том случае, когда вы хотите объявить очень большой строковый столбец, помните, что существует множество причин не использовать длинные строки - ограничения клиентской памяти или размеров индекса, а для Firebird 1.0.x еще и декомпрессия строк фиксированной и переменной длины в объявленную длину до того, как они покинут сервер.

Основы использования строк

Атрибут символьных типов CHARACTER SET важен не только для совместимости с интерфейсом локализованных приложений, но также в некоторых случаях для определения размера столбца. Отдельные наборы символов используют несколько байтов для хранения одного символа- обычно два или три в Firebird. Когда используются такие наборы символов, максимальный размер уменьшается в два или три раза.

! ! !

ПРИМЕЧАНИЕ. Атрибут CHARACTER SET в объявлении является необязательным. Если никакой набор символов не определяется на уровне столбца, то атрибут CHARACTER SET устанавливается в значение набора символов по умолчанию для базы данных. Механизм определения набора символов для столбцов и переменных обсуждается более подробно позже в этой главе.

. ! .

Наборы символов и последовательность сортировки

Набор символов, выбранный для хранения текстовых данных, определяет:

* символы, которые могут быть использованы в столбцах CHAR, VARCHAR и BLOB SUB_TYPE | (текст);

* число байтов, выделяемых для каждого символа;

* последовательность сортировки по умолчанию (алфавитно-цифровой порядок), используемая при сортировке столбцов CHAR и VARCHAR (столбцы BLOB не могут сортироваться - так что последовательность сортировки для них не применяется).

Если для столбца вы не укажете набор символов, то для него будет использован набор символов по умолчанию базы данных. Если для базы данных не указан набор символов по умолчанию, то столбец получит значение CHARACTER SET NONE. ЕСЛИ ваша база данных используется в окружении, где присутствует только английский язык, у вас может появиться соблазн не использовать набор символов. Не соблазняйтесь! Набор символов NONE безропотно примет любые однобайтовые символы. Проблемы появятся- в неанглийском окружении или при наличии смешанных языков- вы получите ошибку транслитерации при выборе ваших текстовых данных. То, что уходит, не всегда то же самое, что приходит!

ГЛАВА 12. BLOB и массивы.

Типы BLOB (Binary Large Objects, большие двоичные объекты) являются сложными структурами, используемыми для хранения дискретных объектов данных переменного размера, который может быть очень большим. Они являются "сложными" в том смысле, что Firebird сохраняет эти типы в виде двух частей: специальная гиперссылка (называется BLOB ID) сохраняется в собственной строке, в то время как сами данные хранятся за пределами строки, часто на одной или нескольких страницах базы данных, на которые указывает BLOB_ID.

Firebird использует структуры BLOB для различных внутренних целей. Он также предоставляет две главные категории для пользовательских типов, применяющие этот вид структуры хранения: BLOB и массивы (ARRAY). типы ARRAY могут быть использованы для представления однородных массивов большинства типов данных.

Типы BLOB

Почти любой вид сохраняемых данных может храниться в BLOB: графические картинки, векторные рисунки, звуковые файлы, видео, документы размером с главу или целую книгу, любой вид мультимедийной информации. Поскольку BLOB может содержать различные виды информации, он требует специальной обработки чтения и записи на клиенте.

Типы BLOB могут, когда это возможно

[28]

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

Столбцы BLOB не могут быть проиндексированны.

Поддерживаемые типы BLOB

Firebird имеет два предварительно определенных типа BLOB, отличающиеся атрибутом подтипа (ключевое слово в SQL SUB_TYPE), как описано в табл. 12.1.

Таблица 12.1. Предварительно определенные подтипы BLOB

Сегменты BLOB

Данные BLOB хранятся в различных форматах в обычном столбце данных и вне столбца. Они хранятся в виде сегментов на одной или более страницах базы данных. Сегменты являются дискретными фрагментами неформатированных данных, которые обычно создаются приложением в виде потока и передаются функциям API для пакетирования и передачи по сети по одному блоку за раз непрерывно.

В структуре записи ссылка на данные BLOB осуществляется с помощью идентификатора BLOB (BLOB_ID). BLOB_ID является уникальной шестнадцатеричной парой, которая обеспечивает перекрестные ссылки между данными BLOB и содержащей их таблицей. При поступлении на сервер сегменты сохраняются в базе в том же порядке, как они были получены, хотя не обязательно с теми же размерами фрагментов, с которыми они передавались.

Когда это возможно, BLOB сохраняются на той же странице, что и запись с остальными данными. При этом большие BLOB могут занимать много страниц, а их начальные страницы могут содержать не данные, а массив указателей на страницы с содержимым BLOB.

Типы массивов

Firebird позволяет создавать однородные массивы для большинства типов данных. Использование массива позволяет хранить множество элементов данных в виде дискретных, многомерных элементов в одном столбце. Firebird может выполнять операции над целым массивом, эффективно трактуя его как один элемент, или он может оперировать с частью массива - подмножеством элементов массива. Часть массива может состоять из одного элемента или из набора многих смежных элементов.

Типы ARRAY и SQL

Поскольку в Firebird не существует никакого синтаксиса динамического SQL для обработки типов ARRAY, выполнение DML и поиск таких типов из интерфейсов динамического SQL (DSQL) не является простым делом. API Firebird содержит структуры и функции, позволяющие динамическим приложениям работать с ними напрямую. Некоторые компоненты доступа к данным RAD (например, iBObject, использующиеся в продуктах Borland Delphi и Kylix) содержат классы, инкапсулирующие эту функциональность API в виде свойств и методов клиентской стороны.

ESQL, который не использует структуры и вызовы функций API, поддерживает некоторый статический синтаксис SQL для обработки типов ARRAY и интеграции их с массивами, объявленными во включающем языке.

Для динамических и статических приложений есть подходящее, хотя и не всегда осуществимое решение: чтение данных массива в хранимой процедуре и возвращение значений в том виде, в каком клиентское приложение может их использовать. Позже в разд. "Ограниченный доступ динамического SQL" будет приведен пример.

Когда использовать тип массива

Использование массивов является подходящим, когда:

* элементы данных естественно принимают вид множества данных одного типа;

* весь набор элементов данных в одном столбце базы данных должен быть представлен и должен управляться как одно целое вместо того, чтобы сохранять каждый элемент в отдельном столбце;

* к каждому элементу также должен быть индивидуальный доступ;

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

Подходящие типы элементов

Массивы могут содержать элементы любого поддерживаемого Firebird типа за исключением BLOB. Массивы массивов не поддерживаются. Все элементы конкретного массива имеют один и тот же тип данных.

Определение массивов

Массив может быть определен как домен (с использованием CREATE DOMAIN) или как столбец в операторе CREATE TABLE или ALTER TABLE. Определение домена или столбца как массива похоже на определение любого другого такого объекта, здесь только добавляется указание размерности массива. Размерность массива заключается в квадратные скобки и следует за спецификацией типа данных.

Например, следующий оператор определяет обычный символьный столбец и столбец в виде одноразмерного символьного массива, содержащего восемь элементов:

CREATE TABLE ATABLE (ID BIGINT,

ARR_CHAR(14)[8] CHARACTER SET OCTETS);

/* хранит 1 строку по 8 элементов */

ЧАСТЬ IV. База данных и ее объекты.

ГЛАВА 14. Чертежная доска для базы данных.

Конечно же, база данных хранит данные. Однако данные сами по себе не могут использоваться, если они не были сохранены в соответствии с некоторыми правилами, которые, во-первых, определяют их смысл и значение и, во-вторых, позволяют их отыскивать соответствующим образом. База данных, существующая в контексте системы управления базами данных (СУБД), такой как Firebird, включает в себя множество "вещей" помимо данных.

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

Пользователь SYSDBA и пароль

Во всех версиях Firebird, включая 1.5, пользователь SYSDBA имеет полные права ко всем базам данных на сервере. Инсталляционные скрипты устанавливают базу данных безопасности с паролем по умолчанию masterkey.

Некоторые релизы 1.5 для Linux запускают скрипт, который генерирует новый пароль для пользователя SYSDBA. Вы можете посмотреть сгенерированный пароль в файле SYSDBA.password в корневом каталоге Firebird.

! ! !

ВНИМАНИЕ! Пароль masterkey широко известен. Убедитесь, что вы изменили его на малопонятную восьмисимвольную строку. См. инструкции в главе 34.

Метаданные

Все вместе объекты, определенные в базе данных, называются метаданными или, более традиционно, ее схемой. Процесс создания и модификации метаданных называется определением данных. Термин "определение данных" также часто применяется к описанию одного объекта и его атрибутов.

В этом разделе в деталях рассматриваются концепции, терминология и язык определения данных.

Язык определения данных

Основные структуры базы данных - ее таблицы, просмотры и индексы - создаются с использованием подмножества языка SQL Firebird, известного как язык определения данных (Data Definition Language, DDL). Оператор DDL начинается с одного из ключевых слов CREATE, ALTER, RECREATE или DROP, которые означают создание, изменение, пересоздание или удаление одного объекта, соответственно. База данных, ее объекты, правила и отношения объединяются для формирования структуры реляционной базы данных.

Системные таблицы

Firebird хранит метаданные в множестве таблиц, которые он создает прямо в базе данных, - в системных таблицах. Идентификаторы всех системных таблиц начинаются с символов "RDB$". Например, таблица, которая хранит определения и другую информацию о структурах всех таблиц в вашей базе данных, называется RDB$RELATIONS. Связанная с ней таблица RDB$RELATION_FIELDS хранит информацию и описания всех столбцов в каждой таблице.

Такая "база данных в базе данных" является высоко нормализованной. Операторы DDL разработаны для выполнения безопасных операций с таблицами метаданных и в полном соответствии с каскадными эффектами.

Возможно изменение данных в системных таблицах посредством обычных операций SQL. Некоторые инструменты администратора, такие как isql и gfix, выполняют внутренние изменения данных в системных таблицах. При этом, будучи сложной системой управления базами данных, Firebird не была разработана в предположении, что конечный пользователь будет манипулировать строками системных таблиц.

! ! !

Проектирование базы данных

Хотя реляционные базы данных являются очень гибкими, существует только один способ обеспечения целостности данных и удовлетворительной производительности базы данных - основательное проектирование базы данных. Не существует никакой встроенной защиты от скверных проектных решений.

Хорошее проектирование базы данных имеет несколько преимуществ.

* Удовлетворяет требованиям пользователей к содержимому базы данных. Прежде чем вы сможете начать проектирование базы данных, вы должны провести обширные исследования требований пользователей к базе данных, а также выяснить, как база данных будет использоваться. Наиболее гибкие проекты баз данных на сегодняшний день создаются во время хорошо управляемого процесса анализа, создания прототипа и тестирования; в этот процесс вовлекаются все люди, которые будут использовать базу данных.

* Обеспечивает полноту и целостность данных. При проектировании таблицы вы определяете некоторые атрибуты и ограничения, фильтрующие данные, которые пользователь или приложение могут вводить в таблицу и ее столбцы. Выполняя проверку данных до их помещения в таблицу, база данных реализует правила модели данных и обеспечивает целостность данных.

* Предоставляет естественную, простую в понимании структуру информации. Хорошее проектирование делает запросы более понятными - мала вероятность того, что пользователи привнесут несогласованность в данные или что им потребуется вводить избыточные данные.

ГЛАВА 15. Создание и ведение базы данных.

База данных Firebird - это, прежде всего, файл файловой системы, находящийся под управлением подсистемы ввода/вывода главной машины, на которой выполняется сервер Firebird. Как только сервер создаст этот файл, его система управления начинает управлять его пространством, используя протокол низкого уровня для связи с подсистемой ввода/вывода.

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

Новая, "пустая" база данных занимает на диске около 540-600 Кбайт. Файл базы данных вовсе не является пустым, поскольку "акт создания" - оператор CREATE DATABASE- приводит к созданию более 30 системных таблиц. Эти таблицы будут хранить каждую деталь метаданных, как только объект базы данных будет добавлен или изменен. Так как системные таблицы являются обычными объектами базы данных Firebird, они уже содержат для себя записи метаданных. Сервер уже выделил страницы базы данных на диске для этих данных и создал инвентарные страницы для различных типов объектов.

Обсуждение страниц базы данных см. в предыдущей главе.

Физическое хранение базы данных

Размещение

До создания базы данных вы должны знать, где собираетесь ее создавать. Это не столь глупо, как звучит. Оператор CREATE DATABASE (альтернатива- CREATE SCHEMA) будет создавать файл или файлы с указанными вами именами, однако он не может создать каталоги и не может изменить полномочия доступа файловой системы. Этим деталям следует уделить внимание в первую очередь.

Дополнительно сервер Firebird 1.5 может быть сконфигурирован для ограничения размещения баз данных. Проверьте параметр DatabaseAccess в файле firebird.conf (см. главу 3), чтобы выяснить, где ваш сервер ограничен в доступе. Если у вас установки по умолчанию (Full), то вы можете создавать базу данных в любом месте. Иначе:

* установка Restrict указывает файловой системе иерархию, в которой разрешен доступ к базе данных. Убедитесь, что пользователь, запускающий ваш сервер, имеет достаточные полномочия для создания там файла (или, в случае встроенного сервера Windows, подключающийся пользователь);

* установка None позволяет серверу соединяться только с базами данных, находящимися в списке в aliases.conf. Вы можете создавать базу данных в любом месте, однако, за исключением создания, никакой клиент не будет иметь возможности соединиться с ней, если алиас БД и ее абсолютный адрес не будут присутствовать в aliases.conf.

ГЛАВА 16. Таблицы.

В терминологии SQL-89 и SQL-92 таблицы Firebird являются постоянными базовыми таблицами. Эти стандарты определяют некоторые другие типы, включая просматриваемые таблицы, которые Firebird реализует в виде просмотров (view, см. главу 24), и производные таблицы (derived tables), которые Firebird реализует в виде хранимых процедур выбора (см. главы 28 и 30).

О таблицах Firebird

В отличие от настольных баз данных, таких как Paradox и dBase, база данных Firebird не является серией "табличных файлов", физически организованных в виде строк и столбцов. Firebird хранит данные, независимо от их структуры в сжатом формате на страницах базы данных. Он может хранить одну или более записей - или, более правильно, строк- данных таблицы на одной странице. В случаях, когда данные одной строки слишком велики, чтобы разместиться на одной странице, строка может размещаться на нескольких страницах.

Хотя страница, которая хранит данные таблицы, всегда будет содержать данные, принадлежащие одной таблице, страницы не хранятся рядом. Данные таблицы могут быть разбросаны по всему диску, а в случае многофайловых баз данных они могут быть распределены между разными каталогами и дисками. Данные BLOB хранятся отдельно от строк, которые ими владеют, в страницах базы данных другого типа.

Структурные описания

Метаданные- физические описания таблиц, их столбцов и атрибутов, так же как и описания всех других объектов - сами хранятся в обычных таблицах Firebird внутри базы данных. Сервер Firebird изменяет данные в этих таблицах, когда объекты базы данных создаются, изменяются или удаляются. Он постоянно к ним обращается при выполнении операций над строками. Такие таблицы называются системными таблицами. Более подробную информацию см. в разд. "Системные таблицы" в самом начале главы 14. Схемы системных таблиц см. в приложении 9.

Создание таблиц

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

* вы должны создать базу данных для их размещения - инструкции см. в главе 15;

* вы должны соединиться с базой данных;

* если вы планируете использовать домены для определения типов данных столбцов ваших таблиц, вы должны уже создать домены (см. главу 13).

Владение таблицами и привилегии

Когда создается таблица, Firebird автоматически применяет к ним безопасность схемы по умолчанию. Человеку, который создает таблицу (ее владелец), назначаются к ней все привилегии SQL, включая право передавать привилегии другим пользователям, триггерам и хранимым процедурам. Ни один другой пользователь, за исключением SYSDBA, не будет иметь никакого доступа к этой таблице, пока явно не получит привилегии.

! ! !

ВНИМАНИЕ! Эта защита будет столь же хороша (или плоха), сколь и защита доступа к вашему серверу. Любой, кто может соединиться с вашим сервером, сможет создать базу данных. Любой, кто может соединиться с вашей базой данных, сможет создавать в ней таблицы. Firebird 1.5 несколько улучшает эту печальную ситуацию, позволяя вам ограничивать размещения, где могут создаваться базы данных. См. параметр DatabaseAccess в файле firebird.conf.

. ! .

Ограничения

На языке реляционных баз данных любое условие, налагаемое на формат, диапазон значений, содержание или зависимости структуры данных, называется ограничением (constraint). Firebird предоставляет несколько способов для реализации ограничений, включая как формальные, определенные стандартами ограничение целостности и ссылочное ограничение, так и определенные пользователем ограничения CHECK.

Ограничения видны всем транзакциям, которые выполняют доступ к базе данных, и автоматически применяются на сервере. Они различаются их областью действия. Некоторые, такие как NOT NULL, напрямую применяются к одному столбцу (ограничения столбца), в то время как другие, такие как PRIMARY KEY и некоторые ограничения CHECK, имеют эффект на уровне таблицы (ограничения таблицы). Ограничение FOREIGN KEY имеет область действия таблица-таблица.

Ограничения существуют "в своих собственных правах" как объекты в базе данных Firebird. Каждое ограничение уникально представлено в метаданных с правилами и зависимостями, которые представлены обычными отношениями между системными таблицами.

Ограничения целостности

Ограничения целостности устанавливают правила, которые управляют состоянием доступных элементов данных или отношением между столбцом и таблицей, как целое - часто и тем, и другим. Примерами являются NOT NULL (не допускает ввод, содержащий неопределенное значение), UNIQUE (требует, чтобы вводимый элемент не имел соответствующего значения этого столбца в таблице) и PRIMARY KEY (объединяет два других ограничения, а также "представляет" таблицу для ссылочного отношения с другими таблицами).

Каждое из ограничений целостности подробно обсуждается позже в этой главе.

Ссылочное ограничение

Ссылочное ограничение реализовано как FOREIGN KEY. Ограничение внешнего ключа существует только в контексте другой таблицы и уникального ключа этой таблицы, заданного явно или неявно в предложении REFERENCES при объявлении ограничения.

Таблицы, связанные в отношении внешнего ключа, называются связанными ограничением ссылочной целостности. Следовательно, любой столбец или группа столбцов, ограниченная в ограничениях PRIMARY KEY или UNIQUE, также потенциально являются субъектами ссылочных ограничений.

Ссылочная целостность подробно обсуждается в главе 17.

Ограничения целостности

Ограничение NOT NULL

Firebird не поддерживает атрибут указания допустимости пустого значения, как это делают некоторые нестандартные СУБД. В соответствии со стандартами все столбцы в Firebird могут содержать пустое значение, если не будет явно указано ограничение NOT NULL. Необязательное ограничение NOT NULL является ограничением на уровне столбца, которое может быть применено, чтобы заставить пользователя вводить значение. NULL не является значением, так что любая попытка ввести NULL В столбец или установить его в значение NULL приведет к исключению.

Поскольку роль ограничения NOT NULL заключается в формировании ключей, вы должны знать относительно него некоторые ограничения.

* Оно должно применяться к определению любого столбца, который будет включен в ограничение PRIMARY KEY или UNIQUE.

* В Firebird 1,0.x оно должно применяться к определению любого столбца, который будет включен в ограничение UNIQUE или в уникальный индекс.

* Оно не может быть удалено из домена или столбца операторами ALTER DOMAIN или ALTER TABLE, ALTER COLUMN или перекрыто на уровне столбца. Не используйте домен NOT NULL для определения столбца, который может иметь значение NULL.

Ограничение PRIMARY KEY

PRIMARY KEY является ограничением целостности на уровне столбца - набор поддерживаемых правил, - которое формально отмечает столбец или группу столбцов как уникальный идентификатор для каждой строки в таблице.

Если вы пришли в Firebird из СУБД, которые поддерживают концепцию "первичного индекса" для определения ключа (обычно основанные на файлах системы, такие как Paradox, Access и MySQL), то Firebird и мир стандартов SQL вам понятны. Первичный ключ является не индексом, а ограничением. Одним из правил для такого ограничения является то, что ограничение должно иметь определенный уникальный индекс из одного или более связанных с ним непустых элементов.

Простое создание такого индекса не создает первичный ключ. При этом создание ограничения первичного ключа приводит к созданию требуемого индекса, состоящего из столбцов, перечисленных в объявлении этого ограничения.

! ! !

Ограничения CHECK

Ограничение CHECK используется для проверки достоверности вводимых значений данных. Оно реализует условия или требования, которым должно удовлетворять значение для успешного добавления или обновления. Оно не может изменять вводимое значение; оно лишь вернет исключение проверки достоверности, если значение не будет соответствовать условию.

! ! !

СОВЕТ. Ограничения CHECK применяются после выполнения триггеров "before". Используйте триггер, если вы хотите выполнить проверку и присвоить данным допустимые значения.

. ! .

Ограничения UNIQUE

Ограничение UNIQUE, как и ограничение первичного ключа, гарантирует, что никакие две строки не будут иметь то же значение указанного столбца или группы столбцов. Вы можете объявить для таблицы более одного ограничения UNIQUE, но оно не может использовать тот же набор столбцов, который был использован для ограничения PRIMARY KEY или другого UNIQUE.

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

В Firebird 1.0.x атрибут NOT NULL должен быть применен для всех столбцов, с которыми оперирует ограничение UNIQUE.

Как и ограничение PRIMARY KEY, UNIQUE создает свой постоянный уникальный индекс для поддержания его правил. Правила именования ограничения и индекса соответствует тем же правилам поведения, применимым к другим ключам. Следующий пример isql иллюстрирует именование в Firebird 1.5:

ГЛАВА 17. Ссылочная целостность данных.

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

Реализация формальных ограничений целостности добавляет некоторую дополнительную работу разработчикам баз данных - так какова же окупаемость? Если вы новичок в этой концепции, то вы, безусловно, должны найти множество причин для оправдания дополнительного времени и внимания.

* Бомбоубежище: формальные ссылочные ограничения - особенно при разумном использовании других ограничений - станут надежным бомбоубежищем бизнес- правил вашей базы данных от ошибок приложений, независимо от их источника. Это будет в особенности важным, когда вы начнете устанавливать ваши системы на сайты, где неквалифицированный или частично квалифицированный персонал будет получать доступ к базе данных через утилиты сторонних организаций.

* Скорость запросов: индексы, автоматически созданные для ограничений ссылочной целостности, увеличат скорость операций соединения (join)

[47]

.

* Качество управления: в процессе разработки и тестирования потенциальные ошибки имеют тенденцию проявляться раньше, потому что база данных отменяет операции, которые нарушают правила. Они эффективно уменьшают неприятности в разработке приложения при ошибочных предположениях о согласованности данных.

ГЛАВА 18. Индексы.

Индексы являются атрибутами таблицы, которые могут содержать один столбец или группу столбцов для ускорения поиска строк.

Индекс служит логическим указателем на физическое размещение (адрес) строк в таблице; он используется почти так же, как вы применяете указатель в книге для быстрого поиска номеров страниц разделов, которые вы собираетесь просмотреть. В большинстве случаев, если сервер может прочесть запрашиваемые строки, сканируя индекс вместо сканирования всех строк в таблице, запросы будут выполняться быстрее. Хорошо спроектированная система индексов играет важную роль в настройке и оптимизации условий эксплуатации ваших приложений.

Ограничения

Firebird допускает до 256 определенных пользователем индексов на одну таблицу в версии 1.5 и выше, и 64 в более ранних релизах. Однако это теоретические ограничения, которые могут быть скорректированы за счет размера страницы и фактического размера на диске данных описания индекса в корневой странице индекса. Вы не сможете хранить 256 индексов в базе данных с размером страницы менее 16 Кбайт. На корневой странице индекса каждому индексу нужен 31 байт для его идентификатора, место для описания каждого сегмента (столбца), включенного в состав индекса, и несколько байтов для хранения указателя на первую страницу индекса. Даже страница в 16 Кбайт может не оказаться способной хранить 256 индексов, если в базе данных существует немало составных индексов.

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

Общая длина индекса не может превышать 252 байта. В реальности количество байт может быть значительно меньше. Факторами, которые могут уменьшить количество фактических "мест", доступных для хранения символов, являются:

* интернациональные наборы символов, использующие несколько байт на символ;

* интернациональные наборы символов со сложными парами верхний/нижний регистры и/или сложным словарем правил сортировки;

Автоматические индексы в сравнении с определенными пользователем индексами

Firebird автоматически создает индексы для обеспечения различных ограничений целостности (более подробную информацию см. в главах 16 и 17). Для удаления таких индексов необходимо удалить ограничения, которые их используют.

Использование индексов ограничений не заканчивается их работой по поддержке целостности ключей и отношений. Они рассматриваются вместе со всеми другими при подготовке запросов.

При определении ваших собственных индексов крайне важно исключить создание любых индексов, которые дублируют автоматически сгенерированные индексы. Это ставит оптимизатор (см. разд. "Планы запросов") в печальную ситуацию выбора между равными индексами. В большинстве случаев он разрешит проблему, не выбрав ни одного.

Импорт существующих индексов

Не импортируйте "первичные индексы" таблиц при миграции из другой СУБД. Есть две важные причины отказаться от таких индексов.

* Многие существующие системы используют иерархические структуры индексов для реализации ссылочной целостности. Базы данных SQL не используют подобную логику для реализации ссылочной целостности. Такие индексы обычно влияют на логику оптимизатора Firebird.

* Firebird создает свои собственные индексы для поддержки ограничений первичного и внешнего ключей, независимо от любого существующего индекса. Как было сказано ранее, дублирование индексов приводит к проблемам для оптимизатора и должно быть полностью исключено.

Направленные индексы

Направление сортировки индексов в Firebird является важным. Ошибочно было бы предполагать, что один и тот же индекс может быть использован для сортировки или поиска "в обоих направлениях" - от меньшего к большему и от большего к меньшему. В практике индексы ASC (ASCENDING, в возрастающем порядке) помогут в поиске относительно небольшого количества значений, в то время как индексы DESC (DESCENDING, В убывающем порядке) будут полезными при большом количестве значений.

Если автоматический индекс ASC (по умолчанию), то не будет проблем, если вам нужно определить индекс DESC, использующий тот же столбец (столбцы). Обратное также верно: в Firebird 1.5 и выше вы можете выбрать для автоматически создаваемых индексов убывающий порядок. Оптимизатор не "расстроится", если вы также создадите возрастающий индекс для тех же столбцов.

Планы запросов

Перед выполнением запроса комплект программ подготовки - известный как оптимизатор- начинает анализировать столбцы и операции запроса для вычислен? самого быстрого способа выполнения. Подготовка начинается с просмотра индексов таблицы и используемых столбцов. Работая таким образом с последовательностью путей решения (каждый из которых имеет свою "стоимость"), оптимизатор создает план - некий вид "дорожной карты" того пути, по которому сервер будет следовать при выполнении запроса. Конечный план выбирается по критерию "самой дешевой" дороги, оцениваемой в соответствии с индексами, которые могут быть использованы.

План оптимизатора может быть просмотрен в isql двумя способами.

* По умолчанию isql не отображает план. Используйте SET PLAN ON для отображения плана в самом начале вывода запроса SELECT.

* Используйте SET PLANONLY для рассмотрения запроса и просмотра плана без фактического выполнения запроса. Это позволяет вам анализировать план любого запроса, а не только запросов SELECT.

Можно перекрыть план запроса оптимизатора вашим собственным планом, включив предложение PLAN в оператор запроса. Большинство инструментов графического интерфейса сторонних разработчиков обеспечивают возможность просматривать план, выполняя или не выполняя запрос, и перекрывать его.