Встроенный сервер БД

Software / Программирование
30 сентября 2005

Внедряем Firebird.

Почему-то считается, что для создания так называемых персональных баз данных идеально подходят такие форматы как dBase, Paradox, Access, а реляционные СУБД – это что-то невообразимо сложное и большое. Совершенно ничего не имею против первого, а хочу показать, что второе не такое уж сложное и большое, если использовать правильный сервер. Я буду говорить о Firebird – сервере реляционных баз данных, поддерживающем стандарт ANSI SQL-92 и работающем под Linux, Windows и множеством Unix платформ.

Наверное, как и многие, кто пишет программы в среде Delphi, я начал свое знакомство с миром SQL с сервера InterBase, который фирма Борланд любезно включила в состав дистрибутива своей среды разработки. Не знаю почему, но с тех пор – InterBase, а сейчас Firebird, моя первая любовь в среде баз данных. Сервер Firebird создан на основании открытых исходных текстов InterBase, и весьма основательно отличается от родителя, а в скором будущем произойдет слияние двух популярных версий сервера InterBase - Firebird и Yaffil. Еще одно преимущество – оригинальный InterBase от Борланд уже давно стал платным, а Firebird – нет.


Текущей версией сервера является релиз 1.5.2. Свежую сборку под различные ОС также как и исходные тексты всегда можно найти по следующему адресу: http://firebird.sourceforge.net/.

В версии 1.5 сервера Firebird произошли значительные изменения, по сравнению в версией 1.0.х: движок переписан на С++, добавлена библиотека внедренного сервера, расширен синтаксис языка, как обычно, исправлены старые ошибки, добавлены новые. [Также], теперь Firebird полностью отделен от своего предка: переименованы все основные модули сервера и клиентские библиотеки. Таким образом, [теперь] появилась возможность работы на одной машине как с оригинальным InterBase, так и с Firebird.
Firebird может быть использован как для создания малых баз данных для использования в домашних условиях, так и для больших организаций, обеспечивая надежность и скорость обработки данных.
Многие говорили, ну вот – для работы с базой надо еще и сервер за собой тягать: он и место на диске занимает и в памяти постоянно находится, даже когда не нужен для работы.


Теперь об этих «страхах» можно спокойно забыть. С версии 1.5 Firebird получил возможность работать в качестве embedded (англ. внедренный) сервера, то есть для работы с базами данных нет необходимости иметь запущенный сервер, вся функциональность умещается в одной динамически загружаемой библиотеке. Внедренный сервер обладает теми же особенностями и предоставляет приложению тот же API, что и обычный. Он разработан, чтобы работать как часть существующего приложения.


И что же, мы «безвозмездно, то есть даром» получаем персональную базу данных со всеми возможностями передовых клиент-серверных технологий, таких как хранимые процедуры, триггеры, транзакции. И все это великолепие занимает около двух с половиной мегабайт (естественно, без учета вашей программы и файла базы данных), что значительно меньше примерно восемнадцати мегабайт установленного БДЕ, который обычно используется для доступа к БД dBase, Paradox.


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


Внедренный сервер – это полностью функциональный сервер, который разработан в виде DLL и имеет те же функциональные возможности, что и обычный сервер Firebird. Просто возьмите файл fbembed.dll из дистрибутива, переименуйте его в fbclient.dll или gds32.dll, в зависимости от настроек соединения вашей программы и скопируйте полученный файл в каталог с вашей программой - и все (ну, почти все). Строка подключения к базе данных в ваше программе должна содержать абсолютный путь к локальной базе данных или алиас БД, если он указан в файле конфигурации aliases.conf. Практически, ваше приложение может не знать, работает ли оно с встроенным или обычным сервером БД.


При запуске ваша программа будет использовать внедренный сервер в качестве клиентской библиотеки. При этом можно запускать несколько различных приложений, использующих внедренный сервер, без каких-либо конфликтов между ними, также не обязательно выгружать работающий InterBase или Firebird сервер. Правда, вы не сможете получить доступ к одной базе из нескольких приложений, так как внедренный сервер блокирует базу для эксклюзивного доступа, но ведь для локальной базы нам и не нужен доступ от нескольких клиентов. Тем более, что всегда остается возможность использовать обычный Firebird.
Ну, а если есть необходимость использовать библиотеки INTL (поддержка национальных кодировок) или UDF (функции, определяемые пользователем), их необходимо скопировать в каталоги \INTL или \UDF каталога вашей программы, повторяя структуру каталогов обычного сервера Firebird. Также в каталог с программой можно поместить файл конфигурации firebird.conf и файл сообщений firebird.msg.



Таким образом, мы получаем следующую структуру каталогов:

\ Каталог моей программы \application.exe
\ Каталог моей программы \fbclient.dll или gds32.dll
\ Каталог моей программы \firebird.conf
\ Каталог моей программы \firebird.msg
\ Каталог моей программы \intl\fbintl.dll
\ Каталог моей программы \udf\fbudf.dll

А теперь немного о грустном - плохие новости для любителей безопасности: внедренный сервер не использует в работе базу данных безопасности security.fdb, поэтому любой пользователь может подключиться к любой базе данных, правда, привилегии (роли) пользователя по-прежнему проверяются.


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



Cat's cry