Инструкция по миграции на Firebird v.3. Большие базы данных Firebird. О чем будет Ваш доклад

Внимание!

С версии системы ELMA 3.9.2 началась поддержка Firebird 3.0.1. В базовой поставке ELMA по-прежнему идет Firebird 2.5.

Более ранние версии системы поддерживают работу только с Firebird 2.5.

В системе ELMA версии 3.9.2 и выше при работе с Firebird 3.0.1 поддерживается только создание новых баз ("с нуля") или работа с базами, в которых вручную были сделаны изменения для обеспечения совместимости с новой версией.

Для перехода на Firebird версии 3.0.1 необходимо выполнить следующие действия:

1. Конвертировать базу ELMA с Firebird 2.5 на 3.0.1. Для этого необходимо:

1.1. Подключиться к текущей базе данных ELMA (Firebird 2.5). Для этого можно воспользоваться стандартной или .

1.2. В связи с тем, что в Firebird 3.0 добавилось 3 ключевых слова: DELETING, INSERTING, UPDATING , любые колонки или таблицы с такими именами должны быть пересозданы с указанием регистра. Например, существует таблица SYS_PREUPDATEVERSION с колонкой UPDATING.
Так, для преобразования БД с версии 2.5 на версию 3.0.1, необходимо на старой версии сделать изменение названия колонки. Для этого, необходимо выполнить запрос:

ALTER TABLE SYS_PREUPDATEVERSION ALTER COLUMN UPDATING TO "Updating"

1.3. После этого нужно сделать бэкап БД версии 2.5. Для этого, необходимо выполнить команду в cmd :

gbak -backup -user sysdba -password masterkey "C:\ELMA\UserConfig\BASE.FDB" "C:\ELMA\UserConfig\base_25.fbk"

3. Останавливаем работу службы ELMA. Если:

  • ELMA установлена на IIS . Правой кнопкой мыши нажать на Компьютер , выбрать Управление .

Задачи пула приложений нажать Остановить .

  • ELMA установлена на сервере Cassini. Вызвать Диспетчер задач, перейти на вкладку Службы . Правой кнопкой мыши нажать на строку "ELMA3ExpressCassiniService». Выполнить действие Остановить .

После этого действия служба ELMA будет остановлена.

4. После этого нужно внести изменения в файл configuration. config . Как правило, располагается по следующему пути: \\ \configuration.config .

Вносим следующие изменения:

  • порт, на котором будет работать сервер;

  • имя новой БД.


После внесения изменений сохраняем данный файл.

5. Для того, чтобы ELMA запустилась на Firebird 3.0.1, вносим изменения в файл firebird.conf (путь до файла может выглядеть так: \Program Files\\Firebird_3_0\firebird.conf ). Открываем его для редактирования через любой текстовый редактор.

Нужно убедиться, что в файле firebird.conf прописаны следующие параметры:

  • WireCrypt = Disabled;
  • AuthServer = Legacy_Auth, Srp, Win_Sspi;
  • AuthClient = Legacy_Auth, Srp, Win_Sspi.

В параметре RemoteServicePort можно прописать порт, на котором будет работать сервер. Если тут заменили порт, то в ELMA тоже нужно его поменять.

Также нужно раскомментировать строки с параметрами (убираем знак # ):

  • #WireCrypt = Disabled
  • #AuthServer = Legacy_Auth, Srp, Win_Sspi
  • #AuthClient = Legacy_Auth, Srp, Win_Sspi
  • #RemoteServicePort

Будут выглядеть так:

После внесения изменений файл сохраняем файл firebird.conf .

6. Останавливаем работу службы Firebird. Правой кнопкой мыши нажать на Компьютер , выбрать в контекстном меню пункт Управление .

В левом вертикальном меню открыть Службы и приложения – Службы . Правой кнопкой мыши нажать на "Firebird Server" в списке. Выполнить действие Остановить .

7. Запустить работу службы Firebird. В меню, описанном в п.6, выполнить действие Запустить .

8. Запустить работу службы ELMA.


В левом вертикальном меню открыть Службы и приложения – Диспетчер служб IIS – Подключения – Пулы приложений . В списке фильтров найти ELMA3 и выделить. В правом вертикальном меню Задачи пула приложений и нажать на кнопку Запустить .

  • ELMA установлена на сервере Cassini . Вызвать Диспетчер задач, перейти на вкладку Службы . Правой кнопкой мыши нажать на строку "ELMA3ExpressCassiniService". Выполнить действие Запустить .

После этого действия служба ELMA будет запущена.

9. Убеждаемся в работе веб-приложения ELMA. После запуска ELMA будет создана новая БД с именем, указанным в файле configuration.config . С этого момента работает Firebird 3.0.1.

10. Далее нужно восстановить базу из бэкапа. Для этого необходимо использовать утилиту gbak из состава Firebird 3 (\Program Files\\Firebird_3_0\ ). Для этого останавливаем работу службы ELMA (см п.3) и выполняем команду в cmd :

gbak -replace -user sysdba -password masterkey "C:\ELMA\UserConfig\base_25.fbk" "C:\ELMA\UserConfig\base_30.fdb"

11. Запускаем работу службы ELMA (см п.8).

12. Проверяем, что все запустилось и что старая база данных ELMA отображается в веб-приложении.

13. Выполняем индексацию объектов системы. Для этого нужно зайти в систему под учетной записью администратора и выполнить процедуру индексирования (Администрирование – Система – Индексирование – Индексировать повторно ).

Не так давно вышла новая версия СУБД Firebird. Релиз стал одним из масштабных в истории проекта: была сильно переработана архитектура, добавлена поддержка многопоточности, улучшена производительность. Такое значительное обновление и послужило поводом для повторной проверки Firebird с помощью статического анализатора кода PVS-Studio.

Введение

Ранее Firebird уже проверялся анализатором. С отчётом о предыдущей проверке можно ознакомиться в статье "Побочный результат: проверяем Firebird с помощью PVS-Studio ". Для проверки был взят код с GitHub из ветви master. Сборка подробно описана в соответствующей статье на сайте проекта. Анализ исходных файлов производился в PVS-Studio Standalone версии 6.03 с помощью перехвата вызова компиляторов (Compiler Monitoring). Данная технология позволяет проверять проекты без интеграции в сборочную систему. Полученный отчёт можно просмотреть как в Standalone версии, так и в Visual Studio.

Опечатки

Void advance_to_start()
{
....
if (!isalpha(c) && c != "_" && c != "." && c != "_")
syntax_error(lineno, line, cptr);
....
}

Предупреждение PVS-Studio: V501 There are identical sub-expressions "c != "_"" to the left and to the right of the "&&" operator. reader.c 1203

Анализатор обнаружил, что в логической операции присутствуют два одинаковых подвыражения c != "_" . В последнем условии допущена опечатка и переменная c должна сравниваться с другим символом. В других функциях используется проверка с символом "$", возможно здесь нужно использовать его:

If (!isalpha(c) && c != "_" && c != "." && c != "$")

Ещё один пример ошибки от невнимательности:

Int put_message(....)
{
if (newlen {
put(tdgbl, attribute);
put(tdgbl, (UCHAR) newlen);
}
else if (newlen {
if (!attribute2)
BURP_error(314, "");
....
}
else
BURP_error(315, "");
....
}

Предупреждения PVS-Studio:

  • V601 The string literal is implicitly cast to the bool type. Inspect the second argument. backup.cpp 6113
  • V601 The string literal is implicitly cast to the bool type. Inspect the second argument. backup.cpp 6120

Здесь неверно используется функция BURP_error. Она объявлена следующим образом:

Void BURP_error(USHORT errcode, bool abort,

Const MsgFormat::SafeArg& arg = MsgFormat::SafeArg());

void BURP_error(USHORT errcode, bool abort, const char* str);

Второй аргумент имеет логический тип, а строка стоит третьим аргументом. В результате строковый литерал приводится к true. Вызов функции должен быть переписан как BURP_error(315, true, "") или BURP_error(315, false, "").

Однако, есть случаи, когда распознать ошибку может только разработчик проекта.

Void IDX_create_index(....)
{
....
index_fast_load ifl_data;
....
scb->sort(tdbb);

If (!ifl_data.ifl_duplicates)
BTR_create(tdbb, creation, selectivity);

....
}

Предупреждение PVS-Studio: V581 The conditional expressions of the "if" operators situated alongside each other are identical. Check lines: 506, 509. idx.cpp 509

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

В следующем примере рассмотрим ситуацию, связанную с указателями.

Static void string_to_datetime(....)
{
....

Const char* p = NULL;
const char* const end = p + length;

While (p {
if (*p != " " && *p != "\t" && p != 0)
{
return;
}
++p;
}

....
}

Предупреждение PVS-Studio: V713 The pointer p was utilized in the logical expression before it was verified against nullptr in the same logical expression. cvt.cpp 702

В условии переменная p проверяется на nullptr сразу же после разыменовывания. Это может означать, что на месте проверки должно было быть другое условие либо то, что проверка лишняя.

Если посмотреть выше по коду, то можно найти аналогичный фрагмент:

While (++p {
if (*p != " " && *p != "\t" && *p != 0)
CVT_conversion_error(desc, err);
}

Для того, чтобы избежать подобной ошибки, для сравнения с нулём лучше использовать соответствующие литералы: "\0" для типа char, 0 для чисел и nullptr для указателей. Если взять это за правило, можно избежать множества подобных глупых ошибок.

Опасное использование memcmp

SSHORT TextType::compare(ULONG len1, const UCHAR* str1,

ULONG len2, const UCHAR* str2)
{
....

SSHORT cmp = memcmp(str1, str2, MIN(len1, len2));

If (cmp == 0)
cmp = (len1 len2 ? 1: 0));

Return cmp;
}

Предупреждение PVS-Studio: V642 Saving the "memcmp" function result inside the "short" type variable is inappropriate. The significant bits could be lost breaking the program"s logic. texttype.cpp 3

Функция memcmp возвращает следующие значения:

  • < 0, если str1 меньше str2
  • 0, если str1 равен str2
  • > 0, если str1 больше str2

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

Лишние проверки

Void Trigger::compile(thread_db* tdbb)
{
SET_TDBB(tdbb);

Database* dbb = tdbb->getDatabase();
Jrd::Attachment* const att = tdbb->getAttachment();

If (extTrigger)
return;

If (!statement /*&& !compile_in_progress*/)
{
if (statement)
return;

....
}
}

Предупреждение PVS-Studio: V637 Two opposite conditions were encountered. The second condition is always false. Check lines: 778, 780. jrd.cpp 778

Анализатор нашёл проверку двух противоположных условий. Скорее всего, второе условие здесь стало не нужным в результате изменения первого и его можно удалить, но решение тут стоит принимать автору.

Ещё одним примером странного ветвления может послужить следующий фрагмент кода.

Static void asgn_from(ref* reference, int column)
{
TEXT variable;
TEXT temp;

For (; reference; reference = reference->ref_next)
{
const gpre_fld* field = reference->ref_field;
....

If (!field || field->fld_dtype == dtype_text)
....
else if (!field || field->fld_dtype == dtype_cstring)
....
else
....
}
}

Предупреждение PVS-Studio: V560 A part of conditional expression is always false: !field. int_cxx.cpp 217

Если field не нулевой указатель, то код никогда не достигнет условия в else if. Либо данная проверка лишняя, либо на её месте должно было быть другое сравнение. Неизвестно, противоречит ли данное условие логике приложения.

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

Bool XnetServerEndPoint::server_init(USHORT flag)
{
....

Xnet_connect_mutex = CreateMutex(ISC_get_security_desc(),
FALSE, name_buffer);
if (!xnet_connect_mutex ||
(xnet_connect_mutex && ERRNO == ERROR_ALREADY_EXISTS))
{
system_error::raise(ERR_STR("CreateMutex"));
}

....
}

Предупреждение PVS-Studio: V728 An excessive check can be simplified. The "||" operator is surrounded by opposite expressions "!xnet_connect_mutex" and "xnet_connect_mutex". xnet.cpp 2231

Проверку if (!xnet_connect_mutex || (xnet_connect_mutex && ERRNO == ERROR_ALREADY_EXISTS)) можно упростить до if (!xnet_connect_mutex || ERRNO == ERROR_ALREADY_EXISTS) . Это можно легко доказать с помощью таблицы истинности.

Опасное сравнение беззнаковой переменной

Static bool write_page(thread_db* tdbb, BufferDesc* bdb, ....)
{
....
if (bdb->bdb_page.getPageNum() >= 0)
....
}

Предупреждение PVS-Studio: V547 Expression "bdb->bdb_page.getPageNum() >= 0" is always true. Unsigned type value is always >= 0. cch.cpp 4827

Условие bdb->bdb_page.getPageNum() >= 0 всегда окажется верным, так как функция возвращает значение беззнакового типа. Возможно, программист неверно проверил значение. Принимая во внимания аналогичные сравнения в проекте, можно предположить, что код должен выглядеть следующим образом:

If (bdb->bdb_page.getPageNum() != 0)

Разыменовывание нулевых указателей

Static bool initializeFastMutex(FAST_MUTEX* lpMutex,

LPSECURITY_ATTRIBUTES lpAttributes, BOOL bInitialState,
LPCSTR lpName)
{
if (pid == 0)
pid = GetCurrentProcessId();

LPCSTR name = lpName;

If (strlen(lpName) + strlen(FAST_MUTEX_EVT_NAME) - 2
>= MAXPATHLEN)
{
SetLastError(ERROR_FILENAME_EXCED_RANGE);
return false;
}

SetupMutex(lpMutex);

Char sz;
if (lpName)
....
}

Предупреждение PVS-Studio: V595 The "lpName" pointer was utilized before it was verified against nullptr. Check lines: 2814, 2824. isc_sync.cpp 2814

Предупреждение V595 является самым часто встречаемым в проектах, проверенных PVS-Studio, и Firebird не стал исключением. Всего обнаружено более 30 мест с данным предупреждением.

В этом примере вызов strlen(lpName) идёт перед проверкой указателя на nullptr . Это приведёт к неопределённому поведению при попытке передать в функцию нулевой указатель. Разыменовывание указателя здесь спрятано в вызове strlen , что затрудняет обнаружение ошибки, если не пользоваться статическим анализатором.

Проверка на nullptr после new

Rem_port* XnetServerEndPoint::get_server_port(....)
{
....
XCC xcc = FB_NEW struct xcc(this);

....
}
catch (const Exception&)
{
if (port)
cleanup_port(port);
else if (xcc)
cleanup_comm(xcc);

Return port;
}

Предупреждение PVS-Studio: V668 There is no sense in testing the "xcc" pointer against null, as the memory was allocated using the "new" operator. The exception will be generated in the case of memory allocation error. xnet.cpp 2533

Анализатор предупреждает, что оператор new не может вернуть nullptr - для проверки необходимо использовать блок try-catch или new (std::nothrow) . Однако, в данном примере всё несколько сложнее. Для выделения памяти используется макрос FB_NEW . Он объявлен в файле alloc.h:

#ifdef USE_SYSTEM_NEW
#define OOM_EXCEPTION std::bad_alloc
#else
#define OOM_EXCEPTION Firebird::BadAlloc
#endif

#define FB_NEW new(__FILE__, __LINE__)

inline void* operator new(size_t s ALLOC_PARAMS)
throw (OOM_EXCEPTION)
{
return MemoryPool::globalAlloc(s ALLOC_PASS_ARGS);
}

Сложно сказать, является ли этот конкретный пример ошибкой или нет, так как используется нестандартный аллокатор. Но из-за того, что в определении оператора указан throw (std::bad_alloc) , подобная проверка выглядит подозрительно.

Опасное использование realloc

Int mputchar(struct mstring *s, int ch)
{
if (!s || !s->base) return ch;
if (s->ptr == s->end) {
int len = s->end - s->base;
if ((s->base = realloc(s->base, len+len+TAIL))) {
s->ptr = s->base + len;
s->end = s->base + len+len+TAIL; }
else {
s->ptr = s->end = 0;
return ch; } }
*s->ptr++ = ch;
return ch;
}

Предупреждение PVS-Studio: V701 realloc() possible leak: when realloc() fails in allocating memory, original pointer "s->base" is lost. Consider assigning realloc() to a temporary pointer. mstring.c 42

Выражение вида ptr = realloc(ptr, size) плохо тем, что в случае, когда realloc вернёт nullptr, указатель на память будет потерян. Чтобы этого избежать, следует сохранить результат realloc в временную переменную и после проверки на nullptr присвоить ptr её значение.

Temp_ptr = realloc(ptr, new_size);
if (temp_ptr == nullptr) {
//handle exception
} else {
ptr = temp_ptr;
}

Неиспользованные значения enum в switch

Template
LikeEvaluator ::LikeEvaluator(....)
{
....
PatternItem *item = patternItems.begin();
....
switch (item->type)
{
case piSkipFixed:
case piSkipMore:
patternItems.grow(patternItems.getCount() + 1);
item = patternItems.end() - 1;
// Note: fall into
case piNone:
item->type = piEscapedString;
item->str.data = const_cast
(pattern_str + pattern_pos - 2);
item->str.length = 1;
break;
case piSearch:
item->type = piEscapedString;
// Note: fall into
case piEscapedString:
item->str.length++;
break;
}
....
}

Предупреждение PVS-Studio: V719 The switch statement does not cover all values of the "PatternItemType" enum: piDirectMatch. evl_string.h 324

В конструкции switch были использованы не все значения enum, и отсутствует блок default. Возможно, что здесь забыли добавить обработку piDirectMatch. Список мест с аналогичным предупреждением:

  • V719 The switch statement does not cover all values of the "PatternItemType" enum: piDirectMatch, piSkipMore. evl_string.h 351
  • V719 The switch statement does not cover all values of the "PatternItemType" enum: piDirectMatch. evl_string.h 368
  • V719 The switch statement does not cover all values of the "PatternItemType" enum: piDirectMatch. evl_string.h 387

Переполнение буфера

Const int GDS_NAME_LEN = 32;
....
bool get_function(BurpGlobals* tdgbl)
{
....
struct isc_844_struct {
....
short isc_870; /* gds__null_flag */
....
char isc_874 ; /* RDB$PACKAGE_NAME */
....
} isc_844;

Att_type attribute;
TEXT temp;
....
SSHORT prefixLen = 0;
if (!/*X.RDB$PACKAGE_NAME.NULL*/
isc_844.isc_870)
{
prefixLen = static_cast (strlen(/*X.RDB$PACKAGE_NAME*/
isc_844.isc_874));
memcpy(temp, /*X.RDB$PACKAGE_NAME*/
isc_844.isc_874, prefixLen);
temp = ".";
}
....

Предупреждение PVS-Studio: V557 Array overrun is possible. The value of "prefixLen ++" index could reach 124. restore.cpp 10040

Размер буфера isc_844.isc_874 равен 125, соответственно, максимальное возможное значение strlen(isc_844.isc_874) - 124. Размер temp - 64, что меньше этого значения. Запись по такому индексу может привести к переполнению буфера. Безопасней будет выделить больший объём памяти для переменной temp .

Сдвиг отрицательных чисел

Static ISC_STATUS stuff_literal(gen_t* gen, SLONG literal)
{
....

If (literal >= -32768 && literal return stuff_args(gen, 3, isc_sdl_short_integer, literal,
literal >> 8);

Предупреждение PVS-Studio: V610 Unspecified behavior. Check the shift operator ">>". The left operand is negative ("literal" = [-32768..32767]). array.cpp 848

Код содержит сдвиг вправо отрицательного числа. В стандарте C++ указано, что такое действие имеет неуточняемое поведение, значит на разных компиляторах и платформах может выдавать разный результат. Лучше переписать его так:

If (literal >= -32768 && literal
return stuff_args(gen, 3, isc_sdl_short_integer, literal,
(ULONG)literal >> 8);

Ещё одно место, где сработало предупреждение:

V610 Unspecified behavior. Check the shift operator ">>". The left operand is negative ("i64value" = [-2147483648..2147483647]). exprnodes.cpp 6382

Переопределение переменной


{
int exit_code = -1;
try
{
RefPtr ref(svc->svc_existence);
int exit_code = svc->svc_service_run->serv_thd(svc);

Svc->started();
svc->svc_sem_full.release();
svc->finish(SVC_finished);
}
catch (const Exception& ex)
{
// Not much we can do here
}


}

Предупреждение PVS-Studio: V561 It"s probably better to assign value to "exit_code" variable than to declare it anew. Previous declaration: svc.cpp, line 1893. svc.cpp 1898

В этом примере вместо присвоения переменная exit_code переопределяется. Это скрывает из области видимости предыдущую переменную, и в итоге функция возвращает неверное значение, всегда равное -1.

Корректный код:

THREAD_ENTRY_DECLARE Service::run(THREAD_ENTRY_PARAM arg)
{
int exit_code = -1;
try
{
Service* svc = (Service*)arg;
RefPtr ref(svc->svc_existence);
exit_code = svc->svc_service_run->serv_thd(svc);

Svc->started();
svc->svc_sem_full.release();
svc->finish(SVC_finished);
}
catch (const Exception& ex)
{
// Not much we can do here
iscLogException("Exception in Service::run():", ex);
}

Return (THREAD_ENTRY_RETURN)(IPTR) exit_code;
}

Заключение

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

Как Вы уже знаете , 29 сентября в Москве пройдет 3-я Российская Конференция по СУБД Firebird. Большинство внедрений Firebird в прошлые годы оставались без должного освещения, хотя Firebird используется в качестве важной части ИТ-инфраструктуры в таких компаниях и организациях, как ММВБ, Аэрофлот, Внешторгбанк, Федеральной Службе Судебных Приставов РФ, Верховном Суде РФ, ECCO, Finn Flare, Профитмед, Бау-Центр и многих других. Будучи полностью открытой и бесплатной СУБД (без двойного лицензирования, как, скажем, у MySQL), Firebird позволяет строить мощные промышленные системы с базами данных в сотни гигабайт, при этом предъявляя достаточно скромные требования к «железу».
Сегодня мы публикуем анонсы наиболее интересных докладов предстоящей конференции и надеемся, что она привлечет внимание читателей Хабрахабра. По прошествии конференции презентации будут выложены в открытый доступ.

Firebird 3: первое знакомство

На вопросы отвечает Дмитрий Еманов, ведущий архитектор проекта Firebird
О чем будет доклад?
Доклад представляет собой технический обзор Firebird версии 3.0, находящейся в настоящий момент в активной разработке. В его рамках будут озвучены цели и задачи, поставленные проектом перед этой версией. Также раскрываются особенности архитектуры данной версии, подход к решению проблем масштабируемости на SMP/multi-core системах, нововведения ODS 12.
Почему это интересно?
Опытные разработчики знают, что СУБД для программного продукта необходимо выбирать с запасом по функциям и возможностям, так как требования к системам постоянно растут, и в процессе эксплуатации число пользователей и размеры баз данных превышают запланированные, порой во много раз. Firebird 3 реализуется как важный этап проекта FirebirdSQL, этап, который выведет нашу СУБД на новый уровень производительности и надежности, поэтому разработчикам уже сейчас важно знать будущие возможности.
В своем докладе особое внимание я уделю ожидаемым изменениям в части оптимизации запросов и сбора статистики, а также мониторингу производительности. Это особенно важно для больших баз данных, которых в Firebird становится все больше. Также кратко коснусь ряда функциональных изменений, в частности в областях безопасности и языка SQL. Более подробно эти вопросы раскроют мои коллеги Алекс Пешков и Влад Хорсун.

Новая архитектура безопасности в Firebird 3

На вопросы отвечает Алекс Пешков, ведущий разработчик проекта Firebird
О чем будет доклад?
В своем докладе я рассмотрю новые возможности Firebird 3 с точки зрения безопасности. Благодаря выделению всех сетевых взаимодействий в единый модуль «сетевого сервера» в Firebird 3 появляется возможность легко подключить различные плагины авторизации и очень просто реализовать интеграцию с такими системами как Radius и т.д. Но это еще не все, так как возможности новой архитектуры позволяют проводить «тонкую» настройку прав доступа на уровне как сервера, так и баз данных.
Что самое примечательное будет в докладе?
Безопасность является одним из ключевых моментов для современного сервера СУБД. Во времена InterBase эта проблема была одним из самых больных мест для разработчиков, но сейчас ситуация меняется – в Firebird 2.1 появилась Windows Trusted Authentication (возможность единого входа в базу данных, используя аутентификацию Windows), 2.5 расширяет эти возможности, а в 3.0 разработчики получат беспрецедентно мощные и удобные механизмы безопасности, которые позволят реализовать безопасность для приложения любого уровня, от встроенного однопользовательского до ERP c сотнями пользователей.

Большие базы данных Firebird

На вопросы отвечает Алексей Ковязин, IBSurgeon Ltd
О чем будет доклад?
Мой доклад будет посвящен особенностям эксплуатации больших баз данных Firebird. За последние годы базы данных Firebird размером в 50Гб никого не удивляют, промышленно эксплуатируются базы данных в 350-500Гб, и разработчики и администраторы Firebird теперь сталкиваются с проблемами, которые ранее беспокоили только их коллег, работавших с Oracle и MSSQL.
Компания IBSurgeon Ltd накопила значительный опыт в обеспечении работоспособности больших баз Firebird, которым я постараюсь поделиться.
Почему это интересно? Что самое примечательное будет в докладе?
Рано или поздно каждый разработчик или администратор столкнется с тем, что его база данных Firebird выросла из пеленок и нуждается в профессиональном обслуживании. Я расскажу об основных заблуждениях, связанных с большими базами Firebird, коснусь примера с базой данных Firebird в 1 Терабайт, а также покажу на примерах, как использование инструментов и методик IBSurgeon Ltd позволяет обеспечить высокий уровень доступности и производительности Firebird.
Я думаю, профессиональных разработчиков и администраторов Firebird заинтересует рассказ о том, как можно реализовать аудит доступа к БД, а также анализировать SQL запросы закрытых приложений Firebird и InterBase, находить проблемные запросы и извлекать планы SQL запросов прямо «на лету».

Новое в языке SQL в Firebird 2.5 и Firebird 3.0

На вопросы отвечает Влад Хорсун, ведущий разработчик проекта Firebird
Мой доклад будет посвящен новым возможностям языка SQL, реализованным в Firebird 2.5 и запланированным для Firebird 3.0. Версия 2.5 представила достаточно много интересного, например автономные транзакции и запросы к нескольким БД, а в версии 3.0 появится еще больше возможностей, которые понравятся прикладным разработчикам.
Почему Ваш доклад будет интересен?
Большую часть времени программисты, работающие с Firebird, общаются с СУБД именно на языке SQL, поэтому логично, что им должны быть интересны нововведения и расширения языка.
Реализация языка SQL в Firebird традиционно была и остается удобной, полной и богатой возможностями, и в версии 3.0 мы продолжаем эту традицию.
В Firebird 3.0 будет добавлено много интересных новых возможностей, таких как оконные (аналитические) функции, пакеты PSQL, возможность писать внешние функции, хранимые процедуры и триггеры на C/C++, Java,C# и т.п. В докладе я постараюсь охватить все наиболее важные моменты и более подробно рассказать о новшествах в SQL. Так как снапшоты Firebird 3 уже доступны, все желающие могут сами попробовать многие из новых возможностей SQL и на конференции задать уже конкретные вопросы.

Firebird, FIBPlus и MDT - строим системы с сотнями пользователей!

На вопросы отвечает Сергей Востриков, CEO компании Devrace
О чем будет Ваш доклад?
Доклад будет посвящен вопросам производительности информационных систем, использующих Firebird и демонстрации разработчикам таких систем технологической связки FIBPlus и Mirror Database Tools (MDT).
Практика показывает, что в обычной информационной системе рост числа пользователей информационной системы и увеличение объема базы данных приводит к значительному ухудшению производительности.
Эти проблемы, зачастую, начинают решать, наращивая аппаратную мощность сервера.
К сожалению, это не всегда может помочь. В рамках доклада будет описана и продемонстрирована практическая технология MDT, которая создана специально для систем, использующих Firebird, и которая позволит без изменения (или с минимальными изменениями) в коде в разы повысить производительность приложений на базе FIBPlus.
Почему это интересно?
Любой пользователь ждет от программных продуктов быстрой реакции, а потому вопросы производительности затрагивают всех разработчиков. В течение всего периода существования FIBPlus мы уделяли этому большое внимание. В результате, любой разработчик, который использует FIBPlus, имеет в своем распоряжении целый ряд инструментов, специально ориентированных на уменьшение количества запросов, кэширование системной информации и т. д. Все это доступно, но требует от разработчиков кодирования различных схем обновления кэшируемых данных, проверки актуальности, обработки потери связи с сервером и т.д. В рамках же текущего доклада будет продемонстрирован подход, при котором всю головную боль от этих и, на самом деле, многих других проблем берет на себя связка из двух продуктов: FIBPlus и MDT.

FastReport.Net и FastReport VCL 5 - что нового для разработчиков

На вопросы отвечает Михаил Филиппенко, генеральный директор компании Fast Reports
О чем будет доклад?
Это скорее даже не доклад, а набор «хитростей», которые на порядки ускоряют получение долгожданных результатов (отчётов) из баз данных.
Почему это интересно?
Известно, что базы данных и отчёты идут, что называется, рука об руку.
Согласитесь, при работе с базами данных, разработке систем больше внимания должно концентрироваться на разработке баз, запросов, оптимизации размеров и производительности. Видимой части - результатам, которая как раз интересует заказчика, время уделяется по остаточному принципу. Я постараюсь рассказать, как уложить построение эффектных отчётов в это самое остающееся время на примере самого передового на сегодняшний день нашего продукта – FastReport.Net. В частности – использование так называемых «умных объектов».
Кроме того, познакомлю приверженцев зарекомендовавшего себя FastReport на Delphi-платформе с нововведениями, которые ожидают разработчиков в пятой версии этого продукта.
  • конференция
  • Добавить метки