Firebird Documentation Index Firebird Home
Firebird Home Firebird Home

Firebird 2.5 Release Notes

Helen Borrie (Составитель/Редактор)

21 Сентября 2010 - Документ v.0250_57 - для Firebird 2.5.0

Перевод на русский язык – 21 декабря 2010


Содержание

1. Общие сведения
Сообщения об ошибках
Документация
2. Новое в Firebird 2.5
Другие нововведения
3. Изменения в ядре Firebird
Новая многопоточная архитектура
Потокобезопасная клиентская библиотека
Усовершенствования
4. Изменения в Firebird API и ODS
Изменения ODS (структуры данных на диске)
Расширения API (Application Programming Interface)
5. Зарезервированные слова
Сокращение списка зарезервированных ключевых слов
Новые зарезервированные ключевые слова:
Новые незарезервированные ключевые слова:
6. Изменения в параметрах конфигурации
AuditTraceConfigFile
Параметры настройки использования системного файлового кеша
ConnectionTimeout
Authentication
MaxUserTraceLogSize
OldSetClauseSemantics
RemoteAuxPort
RemoteBindAddress
RemoteFileOpenAbility
7. Административные возможности
Новая системная роль RDB$ADMIN
Сервисы трассировки и аудита
Улучшения мониторинга
8. Усиление безопасности
Отключено автоматическое предоставление прав SYSDBA администраторам Windows
9. Язык определения данных - Data Definition Language (DDL)
Ссылки
10. Язык манипулиования данными (DML)
Ссылки
11. Процедурный язык (PSQL)
Ссылки
Автономные транзакции
Использование типа поля таблицы для переменной PSQL
Расширение оператора EXECUTE STATEMENT
Использование подзапросов в PSQL-выражениях
12. Интернациональная языковая поддержка (INTL)
Параметр COLLATION для базы данных
Оператор ALTER CHARACTER SET
Кодировка строки соединения
Другие усовершенствования
13. Утилиты командной строки
fbtracemgr
Считывание пароля из файла
gsec
fbsvcmgr
gbak
nBackup
isql
gpre (Precompiler)
gstat
14. Руководство по установке и миграции
Linux (POSIX)
Windows
15. Обратная совместимость
Проверка метаданных на корректность
Удаленные параметры конфигурации
Изменения в языке SQL
Утилиты
Изменения в API
Усиление безопасности
MacOSX
16. Дистрибутивы для различных платформ
IBM eServer z-Series
Linux/sh4 (Renesas SH)
HP-UX
Поддержка старых платформ Windows 32-bit
17. Исправленные ошибки
Ошибки версии Firebird 2.5.0
Ошибки предыдущих версий
18. Команда разработчиков проекта Firebird 2.5
A. SQLSTATE
Коды и сообщения SQLSTATE
B. Licence Notice

Список таблиц

10.1. Идентификаторы класса символа
18.1. Команда разработчиков Firebird

Список примеров

4.1.

Общие сведения

Сообщения об ошибках

  • Если Вы думаете, что обнаружили ошибку в этой версии, пожалуйста, обратите внимание на инструкции по сообщению об ошибках, приведенные в статье How to Report Bugs Effectively на сайте проекта Firebird.

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

Следуйте этим рекомендациям, когда будете пытаться анализировать ошибку:

  1. Напишите подробный отчет, с указанием точной версии Firebird. Приведите подробную информацию об операционной системе. Включите воспроизводимый пример в Ваш отчет об ошибке и отправьте его в наш Трекер.

  2. Мы будем Вам очень благодарны, если Вы станете постоянным участником тестирования Firebird, подписавшись на Список постоянных тестеров, и будете отправлять нам наилучшие описания ошибок.

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

Документация

Все README-руководства, упомянутые в этом документе, Вы найдете в подкаталоге "doc" Вашей директории с установленной Firebird 2.5.

Автоматически генерируемая страница в трекере содержит ссылки на все ошибки, указанные для этой версии.

-- Команда проекта Firebird

Новое в Firebird 2.5

Главной целью при разработке версии 2.5 было создание основы новой многопоточной архитектуры с более низкоуровневой синхронизацией и большей безопасностью потоков, и которая была бы наиболее общей для архитектур Superserver, Classic Server и Embedded.

Хотя расширение языка SQL не было главной целью этой версии, впервые появилась возможность управлять пользователями посредством SQL-операторов CREATE/ALTER/DROP USER, были добавлены операторы ALTER VIEW и CREATE OR ALTER VIEW. Расширения языка PSQL включают добавление автономных транзакций и возможность выполнять запросы к внешним базам данных с помощью оператора EXECUTE STATEMENT.

Другие нововведения

Другие нововведения и усовершенствования в этой версии:

Усовершенствования администрирования

  • Системный аудит и пользовательская трассировка с помощью Services API, позволяющие отслеживать и анализировать все, что происходит в базе данных в режиме реального времени

  • Новая системная роль RDB$ADMIN в базах данных с ODS версии 11.2 позволяет SYSDBA передавать свои привилегии другому пользователю для каждой базы данных

  • Больше информации в таблицах мониторинга базы данных

  • Асинхронное закрытие соединений с базой данных

  • Доступ обычным пользователям для мониторинга всех соединений под этим же пользователем (т.е. не только CURRENT_CONNECTION)

Дополнения и усовершенствования языка SQL

  • Поддержка регулярных выражений с помощью предиката SIMILAR TO

  • Поддержка ALTER COLUMN для вычисляемых полей (computed columns)

  • Автономные транзакции в PSQL-модулях (хранимые процедуры, триггеры, анонимные PSQL-блоки)

  • Поддержка хранимых процедур в качестве источника данных для представлений (view)

  • Предложения GRANTED BY и GRANTED AS в операторах GRANT и REVOKE, позволяющие предоставлять права от имени другого пользователя, отличного от используемого по умолчанию CURRENT_USER

  • Оператор REVOKE ALL, позволяющий разом отобрать все привилегии у пользователя/роли

  • Поддержка нетипизированных параметров в предикате IS NULL

  • Удаление из списка зарезервированных всех ключевых слов (за некоторыми исключениями), которые не указаны как зарезервированные в SQL-стандарте

Расширения возможностей обработки данных

  • Новые встроенные функции конвертирования UUID CHAR(16) OCTETS строк в RFC4122-совместимый формат и наоборот

  • Возможность обрабатывать 32-битные и 64-битные целые числа как шестнадцатеричные в числовых и строковых литералах

Дополнения API

  • Запросы теперь возвращают код завершения (SQLSTATE) по стандарту SQL-2003

  • Появилась новая константа «DSQL_unprepare» для использования в функции isc_dsql_free_statement, позволяющая «раскомпилировать» запрос (перевести в состояние «unprepared»)

Интернациональная языковая поддержка

  • Предложение COLLATE для оператора CREATE DATABASE

  • Возможность изменить последовательность сортировки (COLLATE), используемую по умолчанию для набора символов

  • Утилита GBAK теперь поддерживает ключи FIX_FSS_DATA и FIX_FSS_METADATA для корректного восстановления баз данных с данными и/или метаданными в кодировке UNICODE_FSS без необходимости использования скриптов и ручного их исправления

  • Нечувствительная к диакритическому знаку (Accent-insensitive) последовательность сортировки (collation) для Unicode

Изменения в ядре Firebird

Главной целью этой версии была переработка многопоточной архитектуры ядра Firebird, чтобы использовать преимущества симметричной многопроцессорной архитектуры (SMP) на многопроцессорных аппаратных средствах. Это значительно улучшает масштабируемость архитектуры Superserver, когда происходит одновременная работа с несколькими базами данных, но самое главное – это появление новой архитектуры «Superclassic», которая заложит основы многопоточной архитектуры Firebird 3.

Новая многопоточная архитектура

Дмитрий Еманов

Владислав Хорсун

Александр Пешков

а также

Николай Самофатов

Роман Симаков

В архитектуре SuperServer были сделаны два основных усовершествования:

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

    Замечание

    По умолчанию параметр «CpuAffinity» по прежнему привязывает сервер в режиме SuperServer к одному процессору. Для лучшей масштабируемости при работе с несколькими базами данных необходимо изменить значение этого параметра в файле firebird.conf.

  2. Небольшое улучшение масштабируемости при работе с одной базой данных на аппаратных средствах с поддержкой SMP.

В архитектуре Classic Server изменения более существенны:

  1. Сервер в режиме Classic Server теперь может быть многопоточным. По-прежнему остается один рабочий поток на каждый процесс, но теперь возможно использование отдельных потоков для параллельных задач, таких как асинхронное отключение, чистка (sweep), межпроцессные коммуникации с менеджером блокировок и т.д.

  2. На платформе POSIX сервисы в режиме Classic Server теперь тоже запускаются в потоках, а не в отдельных процессах, как раньше.

    Замечание

    На платформе Windows сервисы в режиме Classic Server стали запускаться в потоках уже в версии 2.1.

  3. Embedded-библиотека (libfbembed.so - на платформе POSIX и fbembed.dll - на платформе Windows) теперь тоже поддерживает многопоточность и безопасность потоков и может быть использована в многопоточных приложениях.

  4. Тесты подтверждают, что производительность архитектуры Classic Server в этой версии существенно выросла в сравнении с предыдущими версиями.

«Superclassic»

Созданная многопоточная модель для архитектуры Classic Server была выделена в новый режим «Superclassic» из-за возможности обрабатывать несколько работающих потоков (отдельных или объединенных в пул) внутри одного серверного процесса. Новая архитектура сохраняет все особенности архитектуры Classic Server с небольшими отличиями:

  • Безопасное выключение (shutdown) сервера доступно для всех платформ

  • Новая архиектура более производительна, чем Classic Server – примерно на 15-20%, согласно TPC-тестам

  • Новая архитектура использует меньше ресурсов ядра (хотя расход памяти не уменьшился)

  • При сбое основного процесса Superclassic происходит закрытие всех установленных соединений

  • Известные ограничения Services API, существующие для архитектуры Classic Server (такие как невозможность получить список соединений и активных пользователей), не накладываются на архитектуру SuperClassic.

  • На платформе POSIX режим Superclassic не требует использования [x]inetd.

Изменена архитектура встраиваемого сервера (Embedded)

  • Встраиваемая библиотека сервера на платформе Windows (fbembed.dll) теперь использует архитектуру Superclassic, а не Superserver как раньше. Блокировка файла базы данных (которая запрещала устанавливать несколько соединений с одной и той же базой данных из разных процессов) заменена глобальной блокировкой, позволяющей одновременные соединения к одной и той же базе данных из разных процессов. Это позволяет облегчить отладку таких приложений, позволяет использовать стандартные утилиты (gbak, gstat) и т.д.

  • Одно и то же соединение может быть использовано в нескольких параллельных потоках (ссылка в трекере: CORE-2498).

Примечания к использованию

Windows

На платформе Windows архитектуры Classic Server и Superclassic представлены одним файлом fb_inet_server.exe и выбор архитектуры осуществляется параметром командной строки (по умолчанию используется Classic Server).

Чтобы запустить сервер в режиме Superclassic, используйте параметр -m[ulti-threaded]. Запуск сервера в качестве сервиса будет выглядеть следующим образом:

instsvc install -multithreaded

Запуск сервера в качестве приложения будет выглядеть следующим образом:

fb_inet_server -a -m
POSIX

Для платформы POSIX архитектура Superclassic представлена новым исполняемым файлом fb_smp_server. Он запускает прослушивающий процесс (listener), обрабатывающий запросы на соединение, но не требует наличия и использования [x]inetd.

Процесс fb_smp_server использует многопоточное ядро, представленное библиотекой libfbembed.so, в соответствии с требованиями OSRI. Пакет Classic Server также содержит файл fbguard (Guardian), который для архитектуры Superclassic запускает процесс fb_smp_server - аналогично тому, как в режиме Superserver запускается процесс fbserver при установленном Guardian-е.

Несмотря на то, что архитектуры SuperClassic и Classic Server поставляются в одном инсталляционном пакете, режимом по умолчанию (т.е. активным после установки пакета) является режим Classic Server. Для изменения архитектуры сервера на SuperClassic завершите все акивные процессы Firebird и воспользуйтесь интерактивным скриптом changeMultiConnectMode.sh, который находится в подкаталоге bin. На запрос

Which option would you like to choose: multi-(process|thread) [process] ?

введите символ «m» для выбора режима SuperClassic или символ «p» для выбора режима Classic Server. Более подробную информацию см. тут.

Потокобезопасная клиентская библиотека

Дмитрий Еманов

Владислав Хорсун

Александр Пешков

Ссылка в трекере: CORE-707

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

Усовершенствования

Немедленное обнаружение разорванных соединений в режиме Classic Server

Владислав Хорсун

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

Ссылка в трекере: CORE-818

Оптимизации

Извлечение данных

Дмитрий Еманов

Усовершенствован механизм обработки данных при запросах, не обращающихся к полям таблиц, например, в запросах типа SELECT COUNT(*) FROM TABLE.

Ссылка в трекере: CORE-1598

Использование памяти для BLOB

Адриано дос Сантос Фернандес

Оптимизирован расход памяти, выделяемый под временные BLOB-ы.

Ссылка в трекере: CORE-1658

Повышение производительности Update

Владислав Хорсун

Ссылка в трекере: CORE-2672

Целью данного усовершенствования было уменьшить количество операций записи, выполняемых сервером при осуществлении процедуры «careful write» при изменениях данных. Ранее при выполнении массовых изменений (особенно при многократном редактировании одной и той же записи в одной и той же транзакции) количество операций записи на диск было очень большим, а в худшем случае страница данных могла записываться на диск после создания каждой новой версии записи.

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

Увеличен максимальный размер кеша в 64-битных версиях сервера

Владислав Хорсун

Ссылка в трекере: CORE-1687

Предыдущие 64-битные версии Firebird не могли использовать более 2GB (16K * 128 K) кеша. Теперь 64-битные версии Firebird могут быть настроены так, чтобы поместить целиком в кеш даже базы данных более 2GB, при наличии соответствующих ресурсов (свободной памяти). Это может быть очень полезно в высоконагруженных информационных системах с большим количеством чтений.

Теоретический максимальный размер кеша для 64-битных версий Firebird равен 2^31 - 1 (2,147,483,647) страниц.

Размещение баз данных

Александр Пешков

Ссылка в трекере: CORE-1643

Конфигурационный параметр DatabaseAccess получил еще одно назначение: если значение параметра равно Restrict, то первый каталог из перечисленного списка допустимых каталогов будет использоваться как каталог по умолчанию при создании новых баз данных и при поиске файлов баз данных, если не указан полный путь к ним и нет соответствующего псевдонима (alias).

Алгоритм поиска аналогичен алгоритму поиска внешних таблиц (external tables) из списка каталогов параметра ExternalFileAccess и выглядит следующим образом:

  1. Сначала файл базы данных ищется во всех каталогах из списка Restrict.

  2. Если файл не найден:

    • Если выполняется оператор CREATE DATABASE, то база данных будет создана в первом каталоге из списка Restrict.

    • Иначе будет возвращена ошибка.

Текущий каталог

Текущий каталог по-прежнему используется при поиске файла базы данных, если при локальном соединении не был указан полный путь к нему. Но при сетевом соединении (TCP) не рекомендуется соединяться без указания псевдонима (alias) или полного пути файла, поскольку, например, в Windows текущим каталогом при определенных условиях может быть %system%.

Расположение DLL-файлов в Embedded под Windows

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-1814

Механизм определения корневого каталога в версии Embedded на платформе Windows изменен для избежания проблемы «Ад DLL». До сих пор корневым считался каталог, содержащий исполняемый файл самого приложения. Но теперь корневым считается каталог, в котором расположен файл fbembed.dll.

Поддержка больших внешних таблиц

Владислав Хорсун

Ссылка в трекере: CORE-2492

Предыдущие версии Firebird при работе с файлами внешних таблиц использовали 32-битные функции ввода/вывода, что ограничивало размер файла 2 GB. Теперь используются 64-битные функции ввода/вывода, если они поддерживаются файловой системой, что позволяет использовать файлы намного больше 2 GB.

Корректная обработка 64-битных значений в функциях получения статистики

Владислав Хорсун

Александр Пешков

Ссылка в трекере: CORE-2619

В предыдущих версиях в функциях получения статистики 64-битные значения обрабатывались некорректно. Решение проблемы заключается в двух изменениях:

  1. Чтобы в функциях работы со статистикой использовать 64-битные числа, был изменен внутренний класс AtomicCounter.

  2. В утилиты isql и qli были внесены изменения для поддержки 64-битных чисел.

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

Чтобы 32-битные утилиты могли работать с 64-битным сервером, были добавлены новые API-функции и структуры (struct perf64 и perf64_xxx) и изменены утилиты isql и qli для поддержки нового API. Это значит, что утилиты isql и qli версии 2.5 несовместимы со старыми версиями клиентских библиотек.

Самозащита от некорректных UDF-функций

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-1937

Если строковая UDF-функция возвращает указатель на память, выделенную не тем же менеджером памяти, что используется сервером Firebird, использование ключевого слова FREE_IT в объявлении функции может вызвать порчу памяти и вызвать падение сервера. Теперь для самозащиты от таких некорректных UDF-функций сервер:

  1. выявляет такие UDF-функции и возвращает ошибку при их вызове

  2. требует наличия обновленной библиотеки ib_util во всех режимах работы сервера, включая Embedded.

Диагностика

Диагностика транзакций

Claudio Valderrama

Ссылка в трекере: CORE-1600

Улучшена диагностика и сообщения об ошибках при некорректно заполненном TPB (блок параметров транзакции) в следующих случаях:

  • несовместимые параметры одного типа, указанные вместе, например, WAIT и NOWAIT, или READ COMMITTED и SNAPSHOT, или READ ONLY и WRITE

  • неприменимые параметры, например, [NO] RECORD VERSION вместе с уровнем изоляции SNAPSHOT

  • некорректный порядок параметров резервирования таблиц, например, PROTECTED READ <таблица> вместо READ <TABLE> PROTECTED

Сообщения об ошибках доступа

Александр Пешков

Ссылка в трекере: CORE-1234

В сообщениях об ошибках доступа теперь указываются и название таблицы, и название поля.

Усовершенствования сообщений

Владислав Хорсун

Ссылка в трекере: CORE-2587

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


  Database is probably already opened by another engine instance in another Windows session.
    

Усовершенствования метаданных

Сохранение Default Collation для набора символов

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-789

Последовательность сортировки (collation), которая используется по умолчанию для набора символов, теперь можно изменить с помощью нового оператора ALTER CHARACTER SET. При этом установленное значение записывается в поле RDB$DEFAULT_COLLATE_NAME системной таблицы RDB$CHARACTER_SETS и сохраняется после backup/restore.

Изменения в Firebird API и ODS

Изменения ODS (структуры данных на диске)

Новый номер ODS

Firebird 2.5 создает базы данных с версией ODS 11.2.

Максимальный размер страницы

Максимальный размер страницы остался прежним - 16 KБ (16384 байт).

Максимальный размер кеша

Максимальное количество страниц, которые могут быть использованы для кеша базы данных, зависит от разрядности Firebird (64 или 32 бита):

  • 64-битный :: 2^31 -1 (2,147,483,647) страниц

  • 32-битный :: 128,000 страниц (как и в версии 2.1)

Расширения API (Application Programming Interface)

Строка подключения и набор символов

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

Только DPB-соединения поддерживают эту возможность

В текущей реализации эта возможность поддерживается только при подключении через DPB (параметры соединения с базой данных). Функции Service API (isc_spb*) эту возможность пока не поддерживают.

isc_dpb_utf8_filename

Новый параметр соединения isc_dpb_utf8_filename сообщает серверу Firebird, что имя файла в строке соединения передается в кодировке UTF8 (UTF-8). Если параметр isc_dpb_utf8_filename не указан, сервер будет использовать кодировку операционной системы.

Обратная совместимость
Новый клиент, старый сервер

При подключении к серверу с версией ниже 2.5 клиентом от версии 2.5 или выше с использованием параметра isc_dpb_utf8_filename имя файла конвертируется из UTF-8 в кодировку операционной системы клиента и параметр isc_dpb_utf8_filename удаляется из DPB. Совместимость гарантируется только, если кодировки операционных систем на сервере и клиенте совпадают.

Новый клиент, новый сервер, без параметра isc_dpb_utf8_filename

При подключении клиента с версией 2.5 и выше к серверу с версией 2.5 и выше без использования параметра isc_dpb_utf8_filename имя файла автоматически конвертируется из кодовой страницы операционной системы в UTF-8 и в DPB добавляется параметр isc_dpb_utf8_filename. Совместимость гарантируется только, если кодировки операционных систем на сервере и клиенте совпадают.

Новый клиент, новый сервер, с параметром isc_dpb_utf8_filename

Когда используется параметр isc_dpb_utf8_filename клиент передает имя файла на сервер, не изменяя его. Но клиентское приложение уже должно передать имя файла в кодировке UTF-8.

Преобразования кодовой страницы

В ОС Windows используется кодировка Windows ANSI, на всех остальных платформах используется кодировка UTF-8.

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

Данная проблема может быть решена с помощью кодов символов Unicode, в том числе клиентами версий ниже 2.5.

Использование кодов символов Unicode

Любой символ Unicode в имени файла в строке подключения теперь может быть закодирован как ASCII символ. Это достигается подстановкой символа # в качестве префикса перед кодом символа из таблицы Unicode, т.е. #XXXX, где X - шестнадцатеричный код символа (символы 0-9, a-f, A-F).

Если один из символов в строке подключения оказывается равным #, то можно «экранировать» (удвоить) символ ( ## ) или использовать его Unicode-код #0023.

Замечание

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

Поддержка кодов завершения SQLSTATE

Билл Оливер

Дмитрий Еманов

Ссылка в трекере: CORE-1761

Добавлена новая API-функция fb_sqlstate() для преобразования статус-вектора ошибки в 5-ти символьный буквенно-цифровой код завершения (SQLSTATE) по стандарту SQL-2003.

  • Код завершения SQLSTATE представляет собой соединение 2-х символьного SQL CLASS и 3-х символьного SQL SUBCLASS.

  • SQL Операторы теперь возвращают код завершения SQLSTATE.

  • Утилита isql в случае ошибки теперь выводит код SQLSTATE, а не один код SQLCODE, как было ранее

  • Диагностика по кодам SQLCODE устарела и не будет поддерживаться в следующих версиях

Устаревшие коды SQLCODE

Хотя коды SQLCODE являются устаревшими и использование кодов SQLSTATE предпочтительнее, коды SQLCODE пока остаются в Firebird. Функция API isc_sqlcode() все еще поддерживается, так же как обработка исключений с помощью WHEN SQLCODE.

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

«Эффективный Unprepare»

Билл Оливер

Дмитрий Еманов

Ссылка в трекере: CORE-1741

Новый параметр DSQL_unprepare (числовое значение 4) для функции API isc_dsql_free_statement() позволяет переводить DSQL-запросы в состояние «unpreparing».

Ранее функция isc_dsql_free_statement() поддерживала только параметры DSQL_close (для закрытия именованного курсора) и DSQL_drop (для освобождения дескриптора запроса).

Функция fb_cancel_operation

Александр Пешков

Новая API-функция fb_cancel_operation() позволяет отменить выполнение текущих операций в конкретном соединении с базой данных путем блокирования API-вызовов.

Синтаксис

   ISC_STATUS fb_cancel_operation(ISC_STATUS* status_vector,
                                  isc_db_handle* db_handle,
                                  ISC_USHORT option);
        

Параметры

status vector (ISC_STATUS* status_vector)

Указатель на статус-вектор.

db_handle (pointer to a isc_db_handle)

Дескриптор соединения с базой данных.

option (unsigned short: symbol)

Определяет тип действия. Значения параметра:

  • fb_cancel_raise: отменяет любые операции в указаннном соединении. При этом сервер попытается остановить выполнение текущей операции и вернуть исключение со статус-вектором прерванного API-вызова.

    Пример 4.1.

    Поток1:                                Поток2:
    ------------------------------          ------------------------------
    
    isc_dsql_execute(status, ....)
    ........                                fb_cancel_operation(cancel_status, ...)
    status[1] == isc_cancelled;             cancel_status[1] = 0;
                        


  • fb_cancel_disable: запрещает выполнение команды fb_cancel_raise в указанном соединении. Это может быть полезно при выполнении критичеких операций, например, сборки мусора.

  • fb_cancel_enable: позволяет вновь разрешить выполнение команды отмены операции (fb_cancel_raise), если ранее она ранее была запрещена (fb_cancel_disable). Во вновь создаваемом соединении с базой данных выполнение команды fb_cancel_raise разрешено по умолчанию.

  • fb_cancel_abort: принудительно закрывает клиентское соединение. Полезно при необходимости срочно закрыть соединение. Все активные транзакции будут отменены (Rollback), а клиентское соединение будет закрыто без возврата ошибок (со статусом «Sucess»). Используйте с осторожностью!

Использование

Повторять вызов команд fb_cancel_disable и fb_cancel_enable можно много раз.

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

Обратите внимание на асинхронный характер вызова команды fb_cancel_raise!

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

Пример

Поток A:
// разрешаем выполнение fb_cancel_operation в соединении
fb_cancel_operation(isc_status, &DB, fb_cancel_enable);

// запускаем на выолнение долгоиграющий запрос
isc_dsql_execute_immediate(isc_status, &DB, &TR, 0, "запрос", 3, NULL);

// ожидание завершения API-вызова

    Поток B:
    // отменяем текущую операцию
    fb_cancel_operation(local_status, &DB, fb_cancel_raise);

Thread A:
if (isc_status[1])
  isc_print_status(isc_status); // выведет сообщение "operation was cancelled"
          

Функция Shutdown

Александр Пешков

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

Две взаимосвязанные функции fb_shutdown*

Две функции fb_shutdown* могут использоваться в приложениях для встраиваемого (embedded) сервера: fb_shutdown() и fb_shutdown_callback.

Прототипы

   typedef int (*FB_SHUTDOWN_CALLBACK)(const int reason, const int mask, void* arg);

   int fb_shutdown(unsigned int timeout,
                   const int reason);

   ISC_STATUS fb_shutdown_callback(ISC_STATUS* status_vector,
                                   FB_SHUTDOWN_CALLBACK callback_function,
                                   const int mask,
                                   void* arg);
          
fb_shutdown()

Функция fb_shutdown() выполняет остановку различных подсистем сервера Firebird (yValve, engine, redirector) и разрабатывалась в первую очередь для встраиваемого сервера, так как действие функции распространяется только на текущий процесс.

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

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

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

Параметры

Функция fb_shutdown() имеет два параметра:

  1. время ожидания в миллисекундах

  2. причина остановки

    Коды причины (const int reason) отрицательны и приведены в файле ibase.h: имена констант начинаются с fb_shutrsn.

    Замечание

    При вызове функции fb_shutdown() из приложения нужно задавать положительное значение аргумента.

Возвращаемые значения

  • При успешной остановке сервера возвращает ноль.

  • Ненулевое значение говорит об ошибках при остановке сервера. Более подробная информация будет записана в файл firebird.log.

fb_shutdown_callback()

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

Параметры

fb_shutdown_callback() имеет четыре параметра:

status vector (ISC_STATUS* status_vector)

Указатель на структуру статус-вектора.

pointer to callback function (FB_SHUTDOWN_CALLBACK callback_function)

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

  1. Причина остановки сервера.

    Коды причин приведены в файле ibase.h: имена констант начинаются с fb_shutrsn. Наиболее интересны две из них:

    • fb_shutrsn_exit_called: Firebird завершается командой exit() или выгружается библиотека встраиваемого сервера

    • fb_shutrsn_signal: применим только для POSIX ОС: сигнал SIGINT или SIGTERM

    Замечание

    Нужно использовать положительные значения констант при вызове вызовов команды fb_shutdown().

  2. Актуальное значение маски для вызова

    Этот параметр определяет, когда запускается функция обратного вызова - до или после остановки сервера.

  3. Параметр для прикладного применения

    Определяется приложением и может быть использован для любых целей (может иметь значение NULL).

 

Возвращаемые значения

При успешном выполнении функция обратного вызова вовращает ноль. Отличное от нуля интерпретируется по маске вызова (смотрите далеее описание следующего параметра):

  • При вызове fb_shut_postproviders это приводит к возврату ненулевого значения функцией fb_shutdown(). Функция обратного вызова отвечает за возврат точных причин ошибки.

  • При вызове fb_shut_preproviders возврат ненулевого значения говорит о невозможности остановки сервера.

    Подсказка

    Возврат ненулевого значения при остановке сервера командой exit() является плохой идеей.

Маска вызова - call mask (const int mask)

Может принимать следующие символические значения:

  • fb_shut_preproviders: функция обратного вызова выполняется до остановки сервера

  • fb_shut_postproviders: функция обратного вызова выполняется после остановки сервера

  • Сочетание этих параметров

Значения для маски вызова

fb_shut_confirmation

Сервер запросит подтверждение готовности к остановке

fb_shut_preproviders

Операции дожны быть выполнены до остановки сервера

fb_shut_postproviders

Операции дожны быть выполнены после остановки сервера

fb_shut_finish

Заключительная очистка

Возврат ненулевого значения при fb_shut_confirmation (без флага fb_shut_preproviders) означает, что остановка сервера не будет выполняться.

argument (void* arg)

Это параметр для передачи функции callback_function.

Использование функции fb_shutdown

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

#include <ibase.h>

// callback function for shutdown
static int ignoreCtrlC(const int reason, const int, void*)
{
  return reason == fb_shutrsn_signal ? 1 : 0;
}

int main(int argc, char *argv[])
{
        ISC_STATUS_ARRAY status;
        if (fb_shutdown_callback(status, ignoreCtrlC, fb_shut_confirmation, 0))
  {
    isc_print_status(status);
    return 1;
  }
  // другой прикладной код
}
            

Новые константы isc_spb_prp_* для функции Shutdown

Services API поддерживает новые параметры команды и режимы выключения (shutdown) базы данных с помощью констант isc_spb_prp_*.

isc_spb_prp_shutdown_mode и isc_spb_prp_online_mode

Эти команды используются для выключения (shutdown) и включения (bring online) базы данных и принимают на вход однобайтовые параметры, указывающие режим выключения базы данных, аналогично параметрам команды gfix -shut:

  • isc_spb_prp_sm_normal

  • isc_spb_prp_sm_multi

  • isc_spb_prp_sm_single

  • isc_spb_prp_sm_full

При выключении базы данных также необходимо задать тип операции:

  • isc_spb_prp_force_shutdown

  • isc_spb_prp_attachments_shutdown

  • isc_spb_prp_transactions_shutdown

После типа операции указывается 4-х байтовый (integer) параметр, определяющий задержку (в секундах) при выполнении операции.

Замечание

Старый формат команд также поддерживается и может использоваться с режимами по умолчанию - выключения (режим 'multi') и включения ('normal').

Примеры использования

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

Выключение базы данных и перевод в однопользовательский режим доступа:
  fbsvcmgr service_mgr action_properties dbname employee
    prp_shutdown_mode prp_sm_single prp_force_shutdown 0
                
Выключение базы данных и перевод в многопользовательский режим доступа:
  fbsvcmgr service_mgr action_properties dbname employee
    prp_online_mode prp_sm_multi
                
Запрет на новые соединения и полное выключение базы данных через 60 секунд:
  fbsvcmgr service_mgr action_properties dbname employee
    prp_shutdown_mode prp_sm_full prp_attachments_shutdown 60
                
Возврат базы данных в нормальное состояние:
  fbsvcmgr service_mgr action_properties dbname employee
    prp_online_mode prp_sm_normal
                

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

Александр Пешков

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

  • isc_dpb_shutdown и isc_dpb_online

  • isc_dpb_gbak_attach, isc_dpb_gfix_attach и isc_dpb_gstat_attach

  • isc_dpb_verify

  • isc_dpb_no_db_triggers

  • isc_dpb_set_db_sql_dialect

  • isc_dpb_sweep_interval

  • isc_dpb_force_write

  • isc_dpb_no_reserve

  • isc_dpb_set_db_readonly

  • isc_dpb_set_page_buffers (для архитектуры SuperServer)

Параметр isc_dpb_set_page_buffers может использоваться обычным пользователем в архитектуре Classic Server для установки временного размера страничного буфера для текущего соединения. При использовании его пользователем SYSDBA во всех архитектурах размер страничного буфера записывается в заголовок базы данных, т.е. устанавливается его новый постоянный размер.

Важное замечание для разработчиков и пользователей драйверов доступа к данным и приложений

Это изменение затронуло все перечисленные параметры DPB, значения которых были явно установлены (включением в DPB по умолчанию или настройкой на уровне приложения). Например, приложение с параметрами подключения к базе данных 'RESERVE PAGE SPACE=TRUE' и 'FORCED WRITES=TRUE' корректно работало с Firebird до версий 1.5.6, 2.0.5 и 2.1.2, но теперь при соединении обычных (не-SYSDBA) пользователей с ошибкой ISC ERROR CODE 335544788, «Unable to perform operation. You must be either SYSDBA or owner of the database.»

Новые сервисы трассировки

Владислав Хорсун

В Services Manager были добавлены пять новых сервисов для управления сессиями трассировки, каждому соответствует функция Services API.

isc_action_svc_trace_start

Начинает сессию трассировки

Параметры:

  isc_spb_trc_name : имя сессии трассировки, строка, необязателен
  isc_spb_trc_cfg  : конфигурация сессии трассировки, строка, обязателен
          

Второй параметр содержит строку с текстом конфигурации сессии. Файл fbtrace.conf находится в корневом каталоге Firebird и содержит шаблон конфигурации (с комментариями и описанием синтаксиса и правил).

Замечание

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

  2. Лишние пробелы в строке игнорируются.

Вывод:

  • Текстовое сообщение рапортует о статусе операции:

      Can not start trace session. There are no trace plugins loaded
                  

    или

      Trace session ID NNN started
                  
  • Во втором случае вслед за сообщением начнут выводиться результаты трассировки.

isc_action_svc_trace_stop

Остановка запущенной сессии трассировки

Параметры:

  isc_spb_trc_id : ID сессии трассировки, integer, обязателен
          

Вывод:

Текстовое сообщение со статусом операции:

  • Trace session ID NNN stopped

  • No permissions to stop other user trace session

  • Trace session ID NNN not found

isc_action_svc_trace_suspend

Приостанавливает активную сессию трассировки

Параметры:

  isc_spb_trc_id : ID сессии трассировки, integer, обязателен
          

Вывод:

Текстовое сообщение со статусом операции:

  • Trace session ID NNN paused

  • No permissions to change other user trace session

  • Trace session ID NNN not found

isc_action_svc_trace_resume

Возобновляет приостановленную сессию трассировки

Параметры:

  isc_spb_trc_id : ID сессии трассировки, integer, обязателен
          

Вывод:

Текстовое сообщение со статусом операции:

  • Trace session ID NNN resumed

  • No permissions to change other user trace session

  • Trace session ID NNN not found

isc_action_svc_trace_list

Список существующих сессий трассировки

Параметров не имеет.

Вывод:

Текстовое сообщение показывает список сессий трассировкии и их состояние:

  • Session ID: <число>

  • name: <строка>. Выводит имя сессии, если оно не пустое

  • user: <строка>. Выводит имя пользователя, запустившего сессию

  • date: YYYY-MM-DD HH:NN:SS, Дата и время старта сессии

  • flags: <строка>, набор флагов через запятую:

    active | suspend

    Состояние запущенной сессии.

    admin

    Выводит «admin», если сессию запустил администратор. Для сессий, созданных обычными пользователями, ничего не выводит.

    system

    Показывает «system», если сессия создана сервером (сессия системного аудита). Отсутствует для сессий пользовательской трассировки.

    audit | trace

    Показывает тип сессии: «audit» для сессий системного аудита или «trace» для сессий пользовательской трассировки.

    log full

    Выводится для сессий трассировки, если файл лога достиг предела.

Замечание

Вывод каждого сервиса может быть получен с помощью вызова isc_service_query с параметром isc_info_svc_line или isc_info_svc_to_eof.

Другие дополнения Services API

Александр Пешков

Использование роли RDB$ADMIN Role в Services API

В SPB (Services Parameter Block - блок параметров сервиса) были добавлены два параметра для предоставления и лишения пользователей Windows прав на роль RDB$ADMIN в базе данных пользователей security2.fdb.

Замечание

Эта возможность также доступна с помощью нового параметра -mapping утилиты gsec.

Флаг isc_action_svc_set_mapping

Выдает права на роль RDB$ADMIN указанному пользователю Windows в базе данных пользователей security2.fdb.

Флаг isc_action_svc_drop_mapping

Забирает права на роль RDB$ADMIN у указанного пользователя Windows в базе данных пользователей security2.fdb.

Параметр isc_spb_sec_admin

Новый параметр isc_spb_sec_admin позволяет пользователю с правами SYSDBA предоставлять или лишать пользователей прав на роль RDB$ADMIN в базе данных пользователей (security2.fdb). Это позволяет дать другим пользователям (кроме SYSDBA) права на создание, изменение и удаление пользователей Firebird.

Параметр isc_spb_sec_admin имеет тип spb_long и может принимать значение 0 (для REVOKE ADMIN ROLE) или любое ненулевое число (для GRANT ADMIN ROLE). Более подробная информация приведена в разделе CREATE/ALTER/DROP USER.

Флаг isc_spb_bkp_no_triggers

Новый флаг SPB позволяет использовать в Services API параметр -nodbtriggers, добавленный в утилиту gbak в версии 2.1 для отключения триггеров базы данных во время резервного копирования и восстановления базы данных. Он может использоваться в наборе необязательных параметров isc_spb_options.

Поддержка nBackup

Ссылка в трекере: CORE-1758

Утилита NBackup выполняет две логические группы операций: блокировку или разблокировку базы данных и ее резервное копирование или восстановление. Ранее блокировку и разблокировку базы данных можно было выполнять удаленно с помощью SQL-запроса ALTER DATABASE, теперь - еще и с помощью новых сервисов Services API:

  • isc_action_svc_nbak - инкрементальное резервное копирование

  • isc_action_svc_nrest - инкрементальное восстановление базы данных

Параметры:

  • isc_spb_nbk_level - уровень резервного копирования (integer)

  • isc_spb_nbk_file - имя файла для резервной копии (string)

  • isc_spb_nbk_no_triggers - флаг отключения триггеров базы данных

Примеры использования

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

Создание резервной копии уровня 0:
  fbsvcmgr service_mgr action_nbak dbname employee
    nbk_file e.nb0 nbk_level 0
                
Создание резервной копии уровня 1:
  fbsvcmgr service_mgr action_nbak dbname employee
    nbk_file e.nb1 nbk_level 1
                
Восстановление базы данных из этих файлов:
  fbsvcmgr service_mgr action_nrest dbname e.fdb
    nbk_file e.nb0 nbk_file e.nb1
               

Параметры FIX_FSS_DATA и FIX_FSS_METADATA доступны в Services API

Александр Пешков

Ссылка в трекере: CORE-2439

Функции FIX_FSS_DATA и FIX_FSS_METADATA, добавленные как ключи утилиты gbak -restore в 2.1 теперь доступны и как параметры команды isc_action_svc_restore в Services API.

Новые флаги SPB: isc_spb_res_fix_fss_data и isc_spb_res_fix_fss_metadata.

Новое API для трассировки

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

Дополнительная информация находится в разделе Плагины для трассировки.

Зарезервированные слова

Замечание

Звездочками (*) отмечены зарезервированные ключевые слова, остальные ключевые слова не являются зарезервированными.

Сокращение списка зарезервированных ключевых слов

Александр Пешков

Ссылка в трекере: CORE-2638

Значительно сокращен список зарезервированных ключевых слов, что должно облегчить процесс миграции баз данных с других СУБД. Список зарезервированных ключевых слов был по возможности приближен к требованиям SQL-стандарта.

Список ключевых слов, которые зарезервированы в Firebird, но не являются зарезервированными в SQL-стандарте:

     ADD *       DB_KEY *    GDSCODE *      INDEX *
     LONG *      PLAN *      POST_EVENT *   RETURNING_VALUES *
     SQLCODE *   VARIABLE *  VIEW *         WEEK *
     WHILE
     

Новые зарезервированные ключевые слова:

      SIMILAR
    

Новые незарезервированные ключевые слова:

      AUTONOMOUS *          BIN_NOT *        CALLER *
      CHAR_TO_UUID *        COMMON *         DATA
      FIRSTNAME *           GRANTED          LASTNAME *
      MIDDLENAME *          MAPPING *        OS_NAME *
      SOURCE *              TWO_PHASE *      UUID_TO_CHAR *
    

Изменения в параметрах конфигурации

В файле конфигурации firebird.conf были сделаны следующие изменения:

AuditTraceConfigFile

Владислав Хорсун

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

Замечание

В корневом каталоге Firebird находится файл fbtrace.conf, содержащий полный список событий, доступных для трассировки и аудита, с их форматом, правилами и синтаксисом.

Более подробное описание смотрите в разделе Системный аудит.

Параметры настройки использования системного файлового кеша

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

FileSystemCacheSize

Николай Самофатов

Параметр FileSystemCacheSize устанавливает максимальный размер оперативной памяти, используемый системным файловым кешем 64-битными Windows XP или Windows Server 2003 с Service Pack 1 или выше. В версии 2.5.0 на платформах POSIX параметр не используется.

Параметр содержит целое число, представляющее собой количество (в процентах) оперативной памяти, которое может быть использовано под файловый кеш. Значение может быть от 10 до 95 процентов. Если задать значение 0, операционная система сама будет определять размер файлового кеша, отводимый Firebird. Некорректные значения будут проигнорированы и будет использовано значение по умолчанию равное 30 процентам. Как и другие параметры, значение параметра считывается сервером один раз при запуске.

Привилегии безопасности Windows

Windows требует обладания привилегией SeIncreaseQuotaPrivilege для управления настройками файлового кеша. Эта привилегия доступна по умолчанию администраторам и службам, а также выдается учетной записи Firebird при установке из дистрибутива Windows Installer.

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

FileSystemCacheThreshold

Владислав Хорсун

Параметр был добавлен в версии 2.1 под названием MaxFileSystemCache. Но поскольку он переименован, описание продублировано в этом документе, чтобы обратить внимание обновляющих версию Firebird.

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

  • Чтобы запретить использование системного файлового кеша, установите значение параметра FileSystemCacheThreshold в ноль

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

Важно

  • Это поведение не зависит от платформы (ОС) и способа задания размера страничного кеша - с помощью параметра DefaultDBCachePages или непосредственно на уровне базы данных.

  • Параметр FileSystemCacheThreshold по умолчанию установлен в 65536 страниц, т.е. системный файловый кеш по умолчанию разрешен.

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

MaxFileSystemCache

Параметр MaxFileSystemCache, добавленный в Firebird 2.1, больше не используется.

ConnectionTimeout

Дмитрий Еманов

В высоконагруженных системах на платформе Windows локальное соединение (XNET) могло завершиться ошибкой из-за таймаута при ожидании от сервера результата вызова функции xnet_response_event. Теперь параметр ConnectionTimeout действует и на локальные (XNET) соединения.

Authentication

Александр Пешков

В версии 2.1 был добавлен параметр Authentication, позволяющий задать режим аутентификации пользователей. В версии 2.5 параметр имеет то же самое назначение, но произошли и некоторые изменения:

  • В версии 2.5 режимы 'mixed' и 'trusted' больше не предоставляют администраторам Windows привилегии SYSDBA автоматически. Более подробное описание приведено в разделе Автоматическое получение прав администраторами Windows.

  • Значение параметра по умолчанию изменено с mixed на native. Для использования Trusted Authentication нужно изменить значение параметра на mixed или trusted.

    Ссылка в трекере: CORE-2376

MaxUserTraceLogSize

Владислав Хорсун

Задает максимальный суммарный размер временных файлов, создаваемых сессией пользовательской трассировки Services API. По умолчанию установлен лимит в 10MB.

OldSetClauseSemantics

Дмитрий Еманов

До версии 2.5 предложение SET оператора UPDATE присваивало новые значения столбцам в порядке перечисления в операторе, и новые значения были доступны для использования этим же оператором. Это не соответствует SQL-стандарту, который требует, чтобы первоначальные значения столбцов не менялись в процессе выполнения оператора. Теперь в предложении SET доступны только старые (первоначальные) значения столбцов.

Параметр OldSetClauseSemantics позволяет восстановить предыдущее поведение в целях совместимости: значение 1 - старый вариант, 0 (по умолчанию) - новый вариант (соответстввующий SQL-стандарту).

Внимание

  • Этот параметр действует на все базы данных на сервере.

  • Этот параметр является временным решением для обеспечения обратной совместимости и будет удален в следующих версиях Firebird.

RemoteAuxPort

Дмитрий Еманов

Ссылка в трекере: CORE-2263

Режимы Classic Server и SuperClassic теперь могут быть настроены на использование для событий (events) одного фиксированного порта, заданного параметром RemoteAuxPort. Для режима SuperServer это было доступно начиная с версии 1.5. Это особенно важно для приложений, соединяющихся с базами данных в сети Internet через брандмауэр (firewall) или туннель, поскольку позволяет использовать в таких системах любые режимы работы сервера.

RemoteBindAddress

Александр Пешков

Ссылка в трекере: CORE-2094

Появилась возможность использовать имя компьютера в параметре RemoteBindAddress (раньше допускалось только использование IP-адреса).

Важно

С помощью RemoteBindAddress также можно «привязать» пользовательские соединения к определенному интерфейсу (сетевой карте). Но при использовании имени компьютера ему не должно соответствовать несколько IP-адресов! В частности, проверьте файл etc/hosts на всех компьютерах, включая сервер.

RemoteFileOpenAbility

Николай Самофатов

Ссылка в трекере: CORE-2263

Компания Red Soft предоставила код, добавляющий на платформе Windows возможность работать с базами данных, расположенными на сетевых ресурсах. Напомним, на платформе POSIX давно существует возможность работать с базами данных на NFS-устройствах.

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

Внимание

Перед тем, как решите использовать эту возможность, обязательно прочитайте примечание к параметру в файле firebird.conf!

Административные возможности

Новая системная роль RDB$ADMIN

Александр Пешков

Для предоставления привилегий SYSDBA другим пользователям была добавлена новая предопределенная системная роль RDB$ADMIN. Любой пользователь, получивший права на роль RDB$ADMIN в конкретной базе, при подключении к этой базе с ролью RDB$ADMIN приобретает все права SYSDBA.

Для выдачи прав на эту роль нужно подключиться к базе данных под учетной записью SYSDBA и дать права на роль RDB$ADMIN пользователю так же, как и на любую другую роль. После этого пользователь может использовать ее при соединении с базой данных как и любую другую роль.

Важно

Если при соединении с базой данных в DPB (параметрах соединения) была указана другая роль, то она не будет автоматически заменена на роль RDB$ADMIN и, соответственно, пользователь в этом соединении не будет обладать правами SYSDBA.

Следующий пример показывает предоставление прав SYSDBA пользователям User1 и Admins\ADMIN. Второй пользователь в данном примере - это обычный пользователь Windows (имеет смысл при использовании Trusted Authetication):

GRANT RDB$ADMIN TO User1;
GRANT RDB$ADMIN TO "Admins\ADMIN";

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

Следует иметь в виду, что владение ролью RDB$ADMIN не превращает обычного пользователя в SYSDBA. Она лишь дает пользователю те же права над объектами, что и у SYSDBA, в той базе данных, в которой ему были выданы права на эту роль.

  • Если пользователю нужны права администратора в нескольких базах данных, то права на роль RDB$ADMIN должны быть ему явно даны в каждой из этих баз.

  • Если права администратора нужны нескольким пользователям, то каждому из них должны быть выданы права на роль RDB$ADMIN.

  • Пользователь, получивший в базе данных роль RDB$ADMIN, может дать права на нее другим пользователям. При этом необязательно указывать WITH ADMIN OPTION (для права предоставлять эту роль другим) или WITH GRANT OPTION (для выдачи разрешений на объекты другим пользователям не будучи владельцем этих объектов) - эти опции устанавливаются неявно (автоматически).

Суперпользователи ОС

На платформах POSIX пользователь root всегда имеет права SYSDBA, но в ОС Windows администраторы домена не имели таких прав до версии Firebird 2.1. В версии Firebird 2.1 был добавлен новый конфигурационный параметр Authentication, позволяющий администраторам Windows автоматически получать права SYSDBA при использовании Trusted Authentication (аутентификации средствами ОС). На платформах POSIX механизм не поменялся, а в ОС Windows, начиная с версии 2.5, пользователи ОС получают права SYSDBA, только если соединились с ролью RDB$ADMIN (если она указана явно или предоставлена автоматически - см. ниже).

Trusted Authentication теперь по умолчанию отключена!

Параметр Authentication в firebird.conf теперь (начиная с версии 2.1.3) по умолчанию имеет значение native. Для разрешения Trusted Authentication его надо явно установить равным trusted или mixed.

Автоматическое получение прав администраторами Windows

Для получения привилегий SYSDBA администраторами домена Windows необходимо разрешить Trusted Authentication на сервере Firebird, а сам администратор домена должен получить роль RDB$ADMIN. Метод, описанный выше для обычных пользователей, применим и для администраторов - каждому из них надо дать права на роль RDB$ADMIN в каждой из баз данных.

Тем не менее можно сконфигурировать сервер таким образом, чтобы роль RDB$ADMIN автоматически предоставлялась администраторам при подключении к базе данных (как на POSIX серверах для пользователей с правами root). Новый оператор ALTER ROLE предназначен для этой (и только для этой) цели.

Оператор ALTER ROLE

Для автоматического предоставления роли RDB$ADMIN администраторам Windows при включенной Trusted Authentication нужно подключиться к любой базе данных c правами SYSDBA и выполнить следующий запрос:

ALTER ROLE RDB$ADMIN SET AUTO ADMIN MAPPING;

Чтобы вернуть режим по умолчанию (без автоматического предоставления роли RDB$ADMIN администраторам Windows), выполните следующий запрос:

ALTER ROLE RDB$ADMIN DROP AUTO ADMIN MAPPING;
Команды Services API

Эти же действия поддерживаются и в Services API двумя командами: isc_action_svc_set_mapping для включения автоматического предоставления роли RDB$ADMIN и isc_action_svc_drop_mapping для отключения автоматического предоставления роли. Эти команды также поддерживаются в утилите fbsvcmgr.

Использование RDB$ADMIN для управления пользователями

Новая команда DDL ALTER USER позволяет обычному пользователю Firebird (не обладающему правами SYSDBA) изменять свой пароль и/или персональные данные (имя пользователя и др.) Пользователи с правами SYSDBA могут также создавать и удалять пользователей. Более подробно это описано в разделе CREATE/ALTER/DROP USER.

Поскольку база данных security2.fdb имеет ODS 11.2 (или должна обновиться до нее), то в ней уже определена также и роль RDB$ADMIN. Так как никто (включая SYSDBA) не имеет возможности подключиться к базе данных пользователей, существуют следующие способы, позволяющие предоставлять роль RDB$ADMIN (и возможность создавать и удалять пользователей) в базе данных security2.fdb обычным пользователям:

  1. Использовать параметр GRANT ADMIN ROLE в операторах CREATE USER или ALTER USER.

    Примечания

    Обратите внимание, что GRANT ADMIN ROLE и REVOKE ADMIN ROLE являются не операторами GRANT/REVOKE, а параметрами операторов CREATE USER и ALTER USER.

    Примеры

    Предоставление прав на роль RDB$ADMIN пользователю alex в базе данных пользователей:

    ALTER USER alex GRANT ADMIN ROLE;

    Аннулирование прав на роль RDB$ADMIN у пользователя alex в базе данных пользователей:

    ALTER USER alex REVOKE ADMIN ROLE;

    Удаление пользователя alex

    DROP USER alex;

  2. Использование утилиты gsec с новым ключом -admin. Ключ имеет один аргумент: YES для предоставления пользователю прав на роль RDB$ADMIN или NO для ее аннулирования прав. Более подробное описание смотрите в разделе Выдача прав на роль RDB$ADMIN пользователям Firebird главы Утилиты командной строки.

  3. Использование нового SPB параметра isc_spb_sec_admin, назначающего роль RDB$ADMIN пользователям в базе данных security2.fdb. Более подробное описание смотрите в разделе Параметр isc_spb_sec_admin главы Изменения в Firebird API и ODS. Утилита fbsvmgr также поддерживает использование этого параметра.

Сервисы трассировки и аудита

Владислав Хорсун

Новые средства трассировки и аудита первоначально основывались на TraceAPI, разработанном Николаем Самофатовым - разработчиком Red Soft Database (коммерческого продукта, основанного на коде Firebird).

Обзор возможностей

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

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

Сервер Firebird имеет фиксированный список событий, которые могут отслеживаться. Существует два способа трассировки: системный аудит и пользовательская трассировка, и в зависимости от способа трассировки сервер формирует список событий для сессии. Каждой сессии присваивается уникальный номер - ID, и при старте сессии Services Manager выводит сообщение с этим ID: «Trace session ID nnnn started».

Системный аудит

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

Новый параметр AuditTraceConfigFile в файле конфигурации firebird.conf задает имя и расположение файла с настройками системного аудита. По умолчанию этот параметр пустой, что означает отсутствие сессий системного аудита. Запущено может быть не более одной системной сессии аудита.

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

Подсказка

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

Пользовательская трассировка

Для управления сессиями пользовательской трассировки добавлены пять новых функций Services API:

  • isc_action_svc_trace_start - запуск

  • isc_action_svc_trace_stop - остановка

  • isc_action_svc_trace_suspend - пауза

  • isc_action_svc_trace_resume - возобновление

  • isc_action_svc_trace_list - получение списка запущенных сессий

Синтаксис функций подробно описан в разделе Новые сервисы трассировки главы Изменения в Firebird API и ODS.

Сессии пользовательской трассировки

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

Замечание

Очевидно, файл конфигурации хранится не на сервере, а на клиентском компьютере, с которого запускаеся сессия пользовательской трассировки. Например, утилита командной строки fbsvcmgr позволяет указать файл конфигурации с помощью параметра trc_cfg.

Вывод сессии пользовательской трассировки сохраняется во временные файлы, каждый размером в 1 МБ. После прочтения файла приложением он автоматически удаляется. По умолчанию максимальный размер файла вовода ограничен 10 МБ. Он может быть изменен в большую или меньшую сторону с помощью параметра MaxUserTraceLogSize в файле firebird.conf.

После запуска сессии пользовательской трассировки чтение ее вывода осуществляется вызовом из приложения функции isc_service_query(). Сервис может генерировать вывод быстрее, чем приложение может прочитать его. Если общий размер вывода достигает значения ограничения MaxUserTraceLogSize, то сервер автоматически приостанавливает сессию слежения. После того, как приложение завершит чтение файла (размером 1 МБ), он удаляется, работоспособность восстанавливается и сервер автоматически запускает приостановленную ранее сессию.

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

Управление сессиями пользовательской трассировки

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

Аварийное завершение

Если все процессы Firebird остановлены, то ни одна из сессий не сохраняется. Это означает, что при закрытии процесса Superserver или Superclassic (остановки службы или завершения сервера, работающего как приложение) все запущенные сессии пользовательской трассировки будут полностью остановлены и команда «resume» не сможет их возобновить. Эта ситуация не распространяется, конечно, на Classic Server, так как каждое подключение к нему создает отдельный серверный процесс.

Пример конфигурации для сессии пользовательской трассировки

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

  1. Трассировка событий компиляции, выполнения и освобождения всех операторов для соединения с номером 12345

    <database mydatabase.fdb>
    	enabled                true
    	connection_id          12345
    	log_statement_prepare  true
    	log_statement_free     true
    	log_statement_start    true
    	log_statement_finish   true
    	time_threshold         0
    </database>
  2. Трассировка выполнения операторов INSERT, UPDATE, DELETE и вложенных вызовов процедур и триггеров с показом соответствующих планов (PLAN) и статистики во всех подключениях заданного пользователя к базе данных «mydatabase.fdb».

    <database mydatabase.fdb>
    	enabled                true
    	include_filter         %(INSERT|UPDATE|DELETE)%
    	log_statement_finish   true
    	log_procedure_finish   true
    	log_trigger_finish     true
    	print_plan             true
    	print_perf             true
    	time_threshold         0
    </database>

Пользовательская трассирова с помощью командной строки

Для трассировки в интерактивном режиме была добавлена новая утилита командной строки fbtracemgr. Синтаксис ее ключей и параметров подробно описан в главе Утилиты командной строки.

Кроме того, для отправки запросов из командной строки может быть использована общая утилита сервисов fbsvcmgr, как показано в примерах ниже.

  1. Запуск сессии с названием «My trace», использованием конфигурационного файла fbtrace.conf и выводом результатов на экран:

      fbsvcmgr service_mgr action_trace_start trc_name "My trace" trc_cfg fbtrace.conf
                  

    Для остановки этой сессии нажмите Ctrl+C в окне консоли fbsvcmgr.

  2. Получение списка запущенных сессий пользовательской трассировки:

      fbsvcmgr service_mgr action_trace_list
                  
  3. Приостановка сессии с ID 1

      fbsvcmgr service_mgr action_trace_suspend trc_id 1
                  
  4. Возобновление ранее приостановленной сессии с ID 1

      fbsvcmgr service_mgr action_trace_resume trc_id 1
                  
  5. Остановка сессии с ID 1

      fbsvcmgr service_mgr action_trace_stop trc_id 1
                  

    Подсказка

    Чтобы узнать ID нужной сессии, выведите список сессий в другом окне консоли.

Область видимости сессий в Windows

Ссылка в трекере: CORE-2588

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

Примеры использования

Существуют три основных варианта использования:

  1. Постоянный аудит активности сервера

    Это серверный системный аудит. Администратор создает или редактирует файл конфигурации аудита, указывает его имя в параметре AuditTraceConfigFile в файле firebird.conf и перезапускает сервер Firebird. Позже администратор может приостановить, возобновить или остановить эту сессию аудита без перезапуска Firebird.

    Важно

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

  2. Интерактивная трассировка некоторых или всех событий в некоторых или во всех базах данных

    Приложение (например, утилита fbtracemgr) запускает сессию пользовательской трассировки, читает ее вывод и отображает на экране в реальном времени. Пользователь может приостановливать, восстанавливать и остановить трассировку.

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

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

Плагины для трассировки

Новое API для трассировки находится в стадии разработки и будет предоставлять возможность обработки событий с помощью внешних плагинов. API аудита уже есть в Firebird 2.5, но оно будет меняться в следующих суб-релизах, поэтому пока не документировано. Стандартный плагин трассировки представлен файлом fbtrace.dll (fbtrace.so), расположенном в каталоге \plugins.

Улучшения мониторинга

Дмитрий Еманов

Firebird 2.5 содержит ряд улучшений мониторинга базы данных, новые таблицы с данными о контекстных переменных и использовании памяти в базах данных с ODS 11.2 и выше. Кроме того, стало возможно закрытие клиентского соединения из другого подключения через MON$-таблицы.

Расширенный доступ для обычных пользователей

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

Ссылка в трекере: CORE-2233

Примечания

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

  2. Это же расширение было реализовано в версии 2.1.2.

Изменения в метаданных мониторинга баз данных с ODS 11.2

Замечание

Метаданные для ODS 11.1 описаны в документации к версии 2.1.

Изменение кодировки в метаданных мониторинга

Набор символов (CHARACTER SET) системного домена RDB$FILE_NAME2, который используется в MON$-таблицах для определения столбцов, относящихся к спецификации файлов, был изменен с NONE на UNICODE_FSS. Это касается столбцов MON$DATABASE_NAME, MON$ATTACHMENT_NAME и MON$REMOTE_PROCESS. Это изменение соответствует новому способу обработки строковых параметров (в т.ч. имен файлов) в DPB.

Ссылка в трекере: CORE-2551

MON$MEMORY_USAGE (использование памяти)


      - MON$STAT_ID (ID статистики)
      - MON$STAT_GROUP (вид статистики)
          0: база данных
          1: соединение
          2: транзакция
          3: оператор
          4: вызов
      - MON$MEMORY_USED (количество используемой памяти, байт)
          Информация о высокоуровневом распределении памяти, выполненном 
          сервером. Может быть полезна для отслеживания утечек памяти и 
          чрезмерного потребления памяти в соединениях, процедурах и т.д.
      - MON$MEMORY_ALLOCATED (количество памяти, выделенной ОС, байт)
          Информация о низкоуровневом распределении памяти, выполненном 
          менеджером памяти Firebird - объем памяти, выделенный операционной
          системой, что позволяет контролировать физическое потребление памяти.

Замечание

Не все записи этой таблицы имеют ненулевые значения, только MON$DATABASE и связанные с выделением памяти объекты имеют ненулевое значение. Малые выделения памяти здесь не фиксируются, а вместо этого добавляются к пулу памяти базы данных.



      - MON$MAX_MEMORY_USED (максимальное количество байт, используемое данным объектом)
      - MON$MAX_MEMORY_ALLOCATED (максимальное количество байт, выделенное ОС данному объекту)
             

MON$CONTEXT_VARIABLES (контекстные переменные)


      - MON$ATTACHMENT_ID (ID соединения)
          Содержит корректное значение только для контекстных переменных уровня
          соединения, для переменных уровня транзакции устанавливается в NULL.
      - MON$TRANSACTION_ID (ID транзакции)
          Содержит корректное значение только для контекстных переменных уровня
          транзакции, для переменных уровня соединения устанавливается в NULL.
      - MON$VARIABLE_NAME (имя контекстной переменной)
      - MON$VARIABLE_VALUE (значение контекстной переменной)
             

Использование памяти в MON$STATEMENTS и MON$STATE

Статистика использования памяти в MON$STATEMENTS и MON$STATE представляет фактическое потребление ее процессором.

Ссылка в трекере: CORE-1583

Примеры использования

Примеры

TOP-10 операторов, отсортированных по расходу памяти:

SELECT FIRST 10
  STMT.MON$ATTACHMENT_ID,
  STMT.MON$SQL_TEXT,
  MEM.MON$MEMORY_USED
FROM MON$MEMORY_USAGE MEM
  NATURAL JOIN MON$STATEMENTS STMT
  ORDER BY MEM.MON$MEMORY_USED DESC

Список всех контекстных переменных текущего соединения:

SELECT
  VAR.MON$VARIABLE_NAME,
  VAR.MON$VARIABLE_VALUE
FROM MON$CONTEXT_VARIABLES VAR
  WHERE VAR.MON$ATTACHMENT_ID = CURRENT_CONNECTION

Завершение запросов и соединений

Таблицы мониторинга доступны только для чтения. Однако в сервер встроен механизм для удаления (и только удаления) записей в таблицах MON$STATEMENTS и MON$ATTACHMENTS, что позволяет, соответственно, завершить активный запрос и закрыть соединение с базой данных (последнее доступно только в базах данных с ODS 11.2).

Отмена всех активных запросов для заданного соединения:

DELETE FROM MON$STATEMENTS
  WHERE MON$ATTACHMENT_ID = 32

Замечание

  • Попытка отмены запросов не выполняется, если в соединении в настоящее время нет никаких выполняющихся операторов.

  • После отмены запросов их вызов API-функции вернет ошибку с кодом isc_cancelled.

  • Последующие запросы в данном соединении не запрещены.

Отключение всех соединений, за исключением своего (текущего):

DELETE FROM MON$ATTACHMENTS
  WHERE MON$ATTACHMENT_ID <> CURRENT_CONNECTION

Замечание

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

  • Закрытое соединение вернет приложению ошибку с кодом isc_att_shutdown.

  • Последующие попытки использовать это соединение (т.е. использовать его handle в API-вызовах) вернут ошибки.

Усиление безопасности

Отключено автоматическое предоставление прав SYSDBA администраторам Windows

В версии 2.1 пользователи, состоящие в группе Администраторы, автоматически получали права SYSDBA при соединении в режиме Trusted Authentication. В версии 2.5 по умолчанию администраторам Windows права SYSDBA не предоставляются - это регулируется отдельно для каждой базы данных с помощью оператора SQL:

ALTER ROLE RDB$ADMIN { SET | DROP } AUTO ADMIN MAPPING

Замечание

Более подробное описание роли RDB$ADMIN читайте в разделе Новая системная роль RDB$ADMIN.

Язык определения данных - Data Definition Language (DDL)

Содержание

Ссылки

В V.2.5 добавлено несколько существенных дополнений и улучшений в DDL.

Ссылки

Видимость изменений хранимых процедур в архитектуре Classic Server

Дмитрий Еманов

Ссылка в трекере: CORE-2052

Больше нет проблемы с видимостью измененных хранимых процедур для параллельных соединений в архитектуре Classic Server - теперь изменения видны всем соединениям сразу же после подтверждения транзакции изменения.

Операторы CREATE/ALTER/DROP USER

Александр Пешков

Ссылка в трекере: CORE-696

В версии 2.5 добавлен синтаксис управления пользователями с помощью SQL.

Операторы CREATE USER и ALTER USER также могут включать предложения GRANT ADMIN ROLE и REVOKE ADMIN ROLE, чтобы SYSDBA мог предоставить обычному пользователю роль RDB$ADMIN для доступа к базе данных пользователей. Более подробная информация приведена в разделе Новая системная рольRDB$ADMIN.

Синтаксис:

Пользователи с правами SYSDBA в текущей базе данных и в системной базе данных пользователей могут добавлять новых пользователей:

CREATE USER <username> {PASSWORD 'password'}
  [FIRSTNAME 'firstname']
  [MIDDLENAME 'middlename']
  [LASTNAME 'lastname']
  [GRANT ADMIN ROLE];
      

Замечание

Параметр PASSWORD обязателен при создании нового пользователя. Это первоначальный пароль нового пользователя и пользователь сможет изменить его позже, с помощью оператора ALTER USER.

Пользователи с правами SYSDBA в текущей базе данных и в системной базе данных пользователей могут изменять пароли и атрибуты существующих пользователей. Непривилегированные пользователи могут использовать этот оператор только для изменения своих атрибутов.

ALTER USER <username>
  [PASSWORD 'password']
  [FIRSTNAME 'firstname']
  [MIDDLENAME 'middlename']
  [LASTNAME 'lastname']
  [{GRANT | REVOKE} ADMIN ROLE];
      

Замечание

Должен быть указан как минимум один из параметров PASSWORD, FIRSTNAME, MIDDLENAME или LASTNAME.

ALTER USER не позволяет изменять имя пользователя. Если необходимо поменять имя пользователя, надо удалить старого пользователя и добавить нового.

Пользователь с привилегиями SYSDBA в текущей базе данных и в базе данных пользователей может удалять пользователей:

 DROP USER <username>; 

Ограничения

Операторы CREATE USER, DROP USER и GRANT/REVOKE ADMIN ROLE доступны только пользователю SYSDBA или пользователям, включенным в роль RDB$ADMIN в текущей базе данных и в системной базе данных пользователей. Обычные (не имеющие привилегий SYSDBA) пользователи могут менять пароль и другие атрибуты только своей учетной записи - при попытке изменить атрибуты другого пользователя будет выдана ошибка.

Примеры:

CREATE USER alex PASSWORD 'test';

ALTER USER alex FIRSTNAME 'Alex' LASTNAME 'Peshkov';

ALTER USER alex PASSWORD 'IdQfA';
      

Синтаксис для изменения представлений (view)

Адриано дос Сантос Фернандес

Ранее для изменения представления надо было удалить его и создать заново с новым определением. Это делало изменение представления очень неудобным, особенно при наличии зависимостей. В версии 2.5 добавлены новые операторы ALTER VIEW и CREATE OR ALTER VIEW.

Ссылки в трекере: CORE-770 и CORE-1640

ALTER VIEW

ALTER VIEW позволяет изменять определение представления без его пересоздания.

CREATE OR ALTER VIEW

Оператор CREATE OR ALTER VIEW изменяет определение представления (как ALTER VIEW), если оно существует, или создает его, если оно не существует.

Синтаксис:

create [ or alter ] | alter } view <имя представления>
  [ ( <список полей> ) ]
as <оператор select>
      

Пример

create table users (
    id integer,
    name varchar(20),
    passwd varchar(20)
);

create view v_users as
    select name from users;

alter view v_users (id, name) as
    select id, name from users;
      

Расширения оператора CREATE VIEW

Поддержка селективных процедур в CREATE VIEW

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-886

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

Пример

    create view a_view as
    select * from a_procedure(current_date);
        

Создание представления на основе UNION без списка столбцов

Дмитрий Еманов

Ссылка в трекере: CORE-1402

При создании представления на основе запроса с UNION теперь необязательно указывать список столбцов.

Пример

 recreate view V1 as
   select d.rdb$relation_id from rdb$database d
   union all
   select d.rdb$relation_id from rdb$database d

 recreate view V2 as
   select d.rdb$relation_id as q from rdb$database d
   union all
   select d.rdb$relation_id as w from rdb$database d
        

Извлечение имен столбцов из запроса

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-2424

Оператор CREATE VIEW теперь может извлекать имена столбцов из запросов, включающих группировку или производную таблицу.

Примеры:

 create view V as 
   select d.rdb$relation_id from rdb$database d 
     group by d.rdb$relation_id

 create view V as 
    select a from (select 1 a from rdb$database);
        

Поддержка ALTER COLUMN для вычисляемых полей

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-1454

Поле таблицы, определенное как вычисляемое (COMPUTED BY), может быть изменено с помощью оператора ALTER TABLE...ALTER COLUMN. Изменить можно только выражение, заданное при определении поля.

Синтаксис:

alter table <table-name>
  alter <computed-column-name>
  [type <data-type>]
  COMPUTED BY (<expression>);
      

Пример:

create table test (
  n integer,
  dn computed by (n * 2)
);
commit;
alter table test
  alter dn computed by (n * 5);
      

Расширения для SQL-привилегий

Александр Пешков

Предложение GRANTED BY

В операторы GRANT и REVOKE добавлены необязательные предложения GRANTED BY и GRANTED AS, позволяющие предоставить права от имени другого пользователя, отличного от CURRENT_USER (используемого по умолчанию).

Синтаксис:

grant <right> to <object>
  [ { granted by | as } [ user ] <имя пользователя> ]

revoke <right> from <object>
  [ { granted by | as } [ user ] <имя пользователя> ]
        

Подсказка

Предложения GRANTED BY и GRANTED AS эквивалентны. GRANTED BY рекомендуется стандартом SQL, но для совместимости с другими серверами (например, Informix) поддерживаем и GRANTED AS.

Пример

При соединении с учетной записью SYSDBA:

create role r1; -- владелец роли - SYSDBA
  /* SYSDBA дает права на роль пользователю user1 с правом
     предоставления прав на роль другим пользователям */
grant r1 to user1 with admin option;
  /* SYSDBA дает права на роль от имени пользователя
     user1 с помощью предложения GRANTED BY */
grant r1 to public granted by user1;
      

в isql это выглядит так:


  SQL>show grant;
  /* Grant permissions for this database */
  GRANT R1 TO PUBLIC GRANTED BY USER1
  GRANT R1 TO USER1 WITH ADMIN OPTION
  SQL>
        

ALTER ROLE

Ссылка в трекере: CORE-1660

Для управления присвоения администраторам Windows привелегий SYSDBA при использовании Trusted Authentication добавлен новый оператор ALTER ROLE (для других целей оператор не используется).

Замечание

Описание использования ALTER ROLE и полное описание роли RDB$ADMIN приведены в подразделе Новая Системная Роль RDB$ADMIN главы «Административные функции».

REVOKE ALL

Ссылка в трекере: CORE-2113

Когда пользователь удален из базы данных пользователей (или удален в операционной системе при использовании Trusted Authentication), указанные для него SQL-привилегии в базах данных должны были удаляться вручную. Теперь появилась возможность удалить все привилегии одной командой для конкретного пользователя или роли.

Синтаксис:

REVOKE ALL ON ALL FROM { <user list> | <role list> }

Пример (при соединении с учетной записью SYSDBA):

# gsec -del guest
# isql employee
fbs bin # ./isql employee
Database:  employee
SQL> REVOKE ALL ON ALL FROM USER guest;
SQL>
        

Параметр COLLATION базы данных

Адриано дос Сантос Фернандес

Ссылки в трекере: CORE-1737 и CORE-1803

При создании баз данных с ODS 11.2 и выше теперь можно указывать необязательный параметр COLLATION, связанный с набором символов, что позволяет создавать все текстовые столбцы, домены и переменные с указанной последовательностью сортировки (collation), если не указан другой COLLATE.

Подсказка

Отметим также, что COLLATION, используемый по умолчанию для набора символов в базе данных, может быть изменен с помощью нового синтаксиса ALTER CHARACTER SET.

Синтаксис:

create database <имя файла>
    [ page_size <размер страницы> ]
    [ length = <длина> ]
    [ user <имя пользователя> ]
    [ password <пароль> ]
    [ set names <набор символов соединения> ]
    [ default character set <набор символов по умолчанию>
      [ collation <collation по умолчанию> ] ]
    [ difference file <имя файла> ]
      

Замечание

Параметр DIFFERENCE FILE не является новым для оператора CREATE DATABASE. Он был добавлен вместе с утилитой nBackup в версии 2.0, но не был документирован. Для получения дополнительной информации смотрите раздел Эволюция оператора CREATE DATABASE в конце данной главы.

Пример

create database 'test.fdb' default character set
  win1252 collation win_ptbr;
      

Оператор ALTER CHARACTER SET

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-1803

Как известно, при определении строковых полей таблицы без явного указания предложения COLLATION будет использована последовательность сортировки, которая используется по умолчанию для набора символов поля. В версии 2.5 появилась возможность изменять эту последовательность сортировки с помощью нового оператора ALTER CHARACTER SET.

Замечание

Строковые константы также используют DEFAULT COLLATION.

Последовательность сортировки уже существующих полей таблиц при выполнении оператора ALTER CHARACTER SET не изменяется.

Синтаксис:

 ALTER CHARACTER SET <набор символов>
  SET DEFAULT COLLATION <последовательность сортировки>

Пример

create database 'people.fdb'
  default character set win1252;

alter character set win1252
  set default collation win_ptbr;

create table person (
  id integer,
  name varchar(50)  /* будет использован набор символов win1252 и collation win_ptbr */
);

insert into person
  values (1, 'adriano');
insert into person
  values (2, 'ADRIANO');

/* вернет обе записи поскольку win_ptbr регистронезависимый */
select * from person where name like 'A%';
      

Подсказка

Смотрите также раздел Сохранение Default Collation для набора символов.

Эволюция оператора CREATE DATABASE

DDL поддерживает регистрацию и изменение состояния nBackup в атрибутах заголовка базы данных начиная с версии Firebird 2.0. В этом разделе описывается использование оператора ALTER DATABASE для старта и завершения сохранения «дельта» (промежуточных) данных в отдельном файле.

Дельта-файл базы данных

По умолчанию дельта-файл сохраняется в той же директории, что и база данных. Он имеет то же имя, что и файл базы данных, но с добавкой расширения .delta. Хотя обычно нет причин менять имя дельта-файла, это можно сделать с помощью оператора alter database add difference file:

alter database add difference file 'путь и имя файла' 

Указанное имя дельта-файла сохранится в системной таблице RDB$FILES.

Для возврата умолчательного имени дельта-файла достаточно выполнить следующую команду:

 alter database drop difference file 

Дополнительную информацию можно прочитать в Release Notes к версии 2.0 или в Руководстве по nBackup.

Параметр DIFFERENCES FILE для оператора CREATE DATABASE

C. Valderrama

В Firebird 2.0 появился синтаксис для задания имени дельта-файла в виде дополнительного параметра оператора CREATE DATABASE. Синтаксис команды такой же, что и приведенный в подразделе Параметр COLLATION базы данных. В операторе ALTER DATABASE ключевое слово DIFFERENCE FILE служит параметром для задания файла. Данный параметр позволяет задать имя дельта-файла, который будет создаваться при выполнении команды ALTER DATABASE BEGIN BACKUP или запуске утилиты nBackup из командной строки.

Пример использования:

  ]..\bin> isql -user sysdba -pass masterke

 Use CONNECT or CREATE DATABASE to specify a database
 SQL> create database 'ticks' difference file 'jaguar';
 SQL> shell dir jaguar;
 Volume in drive F is Firebird
 Volume Serial Number is BCD9-4211

 Directory of ..\bin

 File Not Found
        

Это не ошибка - мы только задали имя дельта-файла. Теперь выполним следующие команды:

 SQL> alter database begin backup;
 SQL> shell dir jaguar;
 Volume in drive F is Firebird
 Volume Serial Number is BCD9-4211

 Directory of ..\bin

 10-11-2009  00:59             8.192 jaguar
                1 File(s)          8.192 bytes
                0 Dir(s)  16.617.979.904 bytes free

 SQL> alter database end backup;
 SQL> shell dir jaguar;
 Volume in drive F is Firebird
 Volume Serial Number is BCD9-4211

 Directory of ..\bin

 SQL> drop database;
 SQL> ˆZ
        

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

 ]..\bin> isql -user sysdba -pass masterke

 Use CONNECT or CREATE DATABASE to specify a database
 SQL> create database 'ticks' difference file 'jaguar';
 SQL> alter database add difference file 'leopard';

 Statement failed, SQLCODE = -607
 unsuccessful metadata update
 -Difference file is already defined
        

Сообщение корректно. Хотя дельта-файл и был удален командой ALTER DATABASE END BACKUP, его имя было сохранено. Допускается задавать только одно имя дельта-файла.

 SQL> alter database drop difference file;
 SQL> alter database begin backup;
 Statement failed, SQLCODE = -607
 unsuccessful metadata update
 -STORE RDB$FILES failed
 -message length error (encountered 278, expected 276)
        

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

 SQL> alter database add difference file 'leopard';
 SQL> alter database begin backup;
 SQL> alter database drop difference file;

 Statement failed, SQLCODE = -607
 unsuccessful metadata update
 -Cannot change difference file name while database is in backup mode
        

Это корректное сообщение.

 SQL> alter database end backup;
 SQL> drop database;
 SQL> ˆZ
        

Язык манипулиования данными (DML)

Содержание

Ссылки

В этой главе описаны изменения в языке манипулирования данными SQL.

Ссылки

SIMILAR TO: поиск по регулярным выражениям

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-769.

Добавлен новый предикат SIMILAR TO, позволяющий проверять строковый аргумент на соответствие регулярному выражению. Предикат применим везде, где уместны логические (boolean) выражения, например, в предложении WHERE, в условиях ограничения целостности CHECK, в PSQL-операторе IF() и т.д.

Синтаксис

<предикат SIMILAR> ::= <строка> [ NOT ] SIMILAR TO <регулярное выражение>
    [ ESCAPE <специальный символ> ]

<регулярное выражение> ::=
      <regular term>
    | <регулярное выражение> <символ вертикальной черты> <regular term>

<regular term> ::=
      <regular factor>
    | <regular term> <regular factor>

<regular factor> ::=
      <regular primary>
    | <regular primary> <символ звездочка>
    | <regular primary> <символ плюс>
    | <regular primary> <вопросительный знак>
    | <regular primary> <repeat factor>

<repeat factor> ::= <фигурная скобка> <нижняя граница>
    [, [ <верхняя граница> ] ] <фигурная скобка>

<нижняя граница> ::= <неотрицательное целое>

<верхняя граница> ::= <неотрицательное целое>

<regular primary> ::=
      <символьный спецификатор>
    | <символ процента>
    | <regular character set>
    | <круглая скобка> <регулярное выражение> <круглая скобка>

<символьный спецификатор> ::=
      <обычный символ>
    | <escaped-символ>

<regular character set> ::=
      <символ подчеркивания>
    | <квадратная скобка> <перечисление символов> ... <квадратная скобка>
    | <квадратная скобка> <символ циркумфлекс> <перечисление символов> ... <квадратная скобка>
    | <квадратная скобка> <перечисление включения> ... <символ циркумфлекс>
                                            <перечисление исключения> ... <квадратная скобка>

<перечисление включения> ::= <перечисление символов>

<перечисление исключения> ::= <перечисление символов>

<перечисление символов> ::=
      <символьный спецификатор>
    | <символьный спецификатор> <символ минус> <символьный спецификатор>
    | <квадратная скобка> <символ двоеточие> <иденификатор класса символа>
                                            <символ двоеточие> <квадратная скобка>

<иденификатор класса символа> ::=
      ALPHA
    | UPPER
    | LOWER
    | DIGIT
    | SPACE
    | WHITESPACE
    | ALNUM

Замечание

  1. <обычный символ> - это любой символ кроме открывающих и закрывающих квадратных, круглых и фигурных скобок, символов вертикальной черты, циркумфлекса, минуса, плюса, звездочки, подчеркивания, процента, вопросительного знака и символа <специальный символ>.

  2. <escaped-символ> это <специальный символ>, за которым следует один из следующих символов: открывающая или закрывающая квадратная, круглая или фигурная скобка, символ вертикальной черты, циркумфлекса, минуса, плюса, звездочки, подчеркивания, процента, вопросительный знак или <специальный символ>.

Таблица 10.1. Идентификаторы класса символа

Идентификатор Описание Примечание
ALPHA Все латинские буквы (a-z, A-Z) Включает латинские буквы с диакритическим знаком, если используется нечувствительная к диакритическому знаку (accent-insensitive) последовательность сортировки (collation)
UPPER Все прописные латинские буквы (A-Z) Включает строчные буквы, если используется регистронезависимая (case-insensitive) последовательность сортировки (collation)
LOWER Все строчные латинские буквы (a-z) Включает прописные буквы, если используется регистронезависимая (case-insensitive) последовательность сортировки (collation)
DIGIT Все арабские цифры (0-9)  
SPACE Пробел (ASCII 32)  
WHITESPACE Все символы-разделители (горизонтальная табуляция (9), перевод строки (10), вертикальная табуляция (11), возврат каретки (13), перевод страницы (12), пробел (32))  
ALNUM Все латинские буквы (ALPHA) и арабские цифры (DIGIT)  


Руководство к использованию

Проверяет, соответствует ли строка хотя бы одному из перечисленных элементов регулярного выражения <регулярное выражение> <символ вертикальной черты> <regular term>

    'ab' SIMILAR TO 'ab|cd|efg'   -- истина
    'efg' SIMILAR TO 'ab|cd|efg'  -- истина
    'a' SIMILAR TO 'ab|cd|efg'    -- ложь
       

Проверяет нулевое или большее количество вхождений элемента в строку: <regular primary> <символ звездочка>

    '' SIMILAR TO 'a*'         -- истина
    'a' SIMILAR TO 'a*'        -- истина
    'aaa' SIMILAR TO 'a*'      -- истина
    'b' SIMILAR TO 'a*'        -- ложь
    'ab' SIMILAR TO 'a*b'      -- истина
    'abab' SIMILAR TO 'ab*'    -- ложь
    'abab' SIMILAR TO '(ab)*'  -- истина
       

Проверяет одинарное или большее количество вхождений элемента в строку: <regular primary> <символ плюс>

    '' SIMILAR TO 'a+'     -- ложь
    'a' SIMILAR TO 'a+'    -- истина
    'aaa' SIMILAR TO 'a+'  -- истина
       

Проверяет одинарное или нулевое количество вхождений элемента в строку: <regular primary> <вопросительный знак>

    '' SIMILAR TO 'a?'     -- истина
    'a' SIMILAR TO 'a?'    -- истина
    'aaa' SIMILAR TO 'a?'  -- ложь
       

Проверяет точное (<значение>) количество вхождений элемента в строку: <regular primary> <фигурная скобка> <значение> <фигурная скобка>

    '' SIMILAR TO 'a{2}'     -- ложь
    'a' SIMILAR TO 'a{2}'    -- ложь
    'aa' SIMILAR TO 'a{2}'   -- истина
    'aaa' SIMILAR TO 'a{2}'  -- ложь
       

Проверяет точное (<значение>) или большее количество вхождений элемента в строку: <regular primary> <фигурная скобка> <значение> <запятая> <фигурная скобка>:

    '' SIMILAR TO 'a{2,}'     -- ложь
    'a' SIMILAR TO 'a{2,}'    -- ложь
    'aa' SIMILAR TO 'a{2,}'   -- истина
    'aaa' SIMILAR TO 'a{2,}'  -- истина
       

Проверяет количество вхождений элемента в строку от <нижняя граница> до <верхняя граница> раз: <regular primary> <фигурная скобка> <нижняя граница> <запятая> <верхняя граница> <фигурная скобка>

    '' SIMILAR TO 'a{2,4}'       -- ложь
    'a' SIMILAR TO 'a{2,4}'      -- ложь
    'aa' SIMILAR TO 'a{2,4}'     -- истина
    'aaa' SIMILAR TO 'a{2,4}'    -- истина
    'aaaa' SIMILAR TO 'a{2,4}'   -- истина
    'aaaaa' SIMILAR TO 'a{2,4}'  -- ложь
       

Проверяет наличие любого (не пустого) символа в строке: <символ подчеркивания>

    '' SIMILAR TO '_'    -- ложь
    'a' SIMILAR TO '_'   -- истина
    '1' SIMILAR TO '_'   -- истина
    'a1' SIMILAR TO '_'  -- ложь
       

Проверяет наличие любой строки любой длины (включая пустую строку): <символ процента>

    '' SIMILAR TO '%'         -- истина
    'az' SIMILAR TO 'a%z'     -- истина
    'a123z' SIMILAR TO 'a%z'  -- истина
    'azx' SIMILAR TO 'a%z'    -- ложь
       

Использование цельного регулярного выражения в качестве подвыражения: <круглая скобка> <регулярное выражение> <круглая скобка>

    'ab' SIMILAR TO '(ab){2}'    -- ложь
    'aabb' SIMILAR TO '(ab){2}'  -- ложь
    'abab' SIMILAR TO '(ab){2}'  -- истина
       

Проверяет символ на соответствие одному из перечисленных: <квадратная скобка> <перечисление символов> ... <квадратная скобка>

    'b' SIMILAR TO '[abc]'    -- истина
    'd' SIMILAR TO '[abc]'    -- ложь
    '9' SIMILAR TO '[0-9]'    -- истина
    '9' SIMILAR TO '[0-8]'    -- ложь
    '8' SIMILAR TO '[7-9]'    -- истина
    '8' SIMILAR TO '[9-7]'    -- истина
       

Проверяет символ на отсутствие в перечислении: <квадратная скобка> <символ циркумфлекс> <перечисление символов> ... <квадратная скобка>

    'b' SIMILAR TO '[^abc]'    -- ложь
    'd' SIMILAR TO '[^abc]'    -- истина
       

Проверяет символ на наличие в перечислении <перечисление включения>, но отсутствие в перечислении <перечисление исключения>: <квадратная скобка> <перечисление включения> ... <символ циркумфлекс> <перечисление исключения> ... <квадратная скобка>

    'b' SIMILAR TO '[abc^d]'        -- истина
    'b' SIMILAR TO '[a-d^b]'        -- ложь
    'b' SIMILAR TO '[abc^b]'        -- ложь
    '3' SIMILAR TO '[[:DIGIT:]^3]'    -- ложь
    '4' SIMILAR TO '[[:DIGIT:]^3]'    -- истина
       

Проверяет символ на принадлежность классу <идентификатор класса символа> (допустимые идентификаторы классов приведены в таблице Идентификаторы класса символа), может быть использовано с символом циркумфлекса для инвертирования логики: <квадратная скобка> <двоеточие> <идентификатор класса символа> <двоеточие> <квадратная скобка>

    '4' SIMILAR TO '[[:DIGIT:]]'  -- истина
    'a' SIMILAR TO '[[:DIGIT:]]'  -- ложь
    '4' SIMILAR TO '[^[:DIGIT:]]' -- ложь
    'a' SIMILAR TO '[^[:DIGIT:]]' -- истина
       

Пример использования специального символа: ESCAPE <специальный символ>

    '(' SIMILAR TO '#(' ESCAPE '#'  -- истина
    '#' SIMILAR TO '##' ESCAPE '#'  -- истина
    '#' SIMILAR TO '#'  ESCAPE '#'  -- ошибка
       

Примеры

create table department (
  number numeric(3) not null,
  name varchar(25) not null,
  phone varchar(14) 
  check (phone similar to '\([0-9]{3}\) [0-9]{3}\-[0-9]{4}' escape '\')
);

insert into department 
  values ('000', 'Corporate Headquarters', '(408) 555-1234');
insert into department 
  values ('100', 'Sales and Marketing', '(415) 555-1234');
insert into department 
  values ('140', 'Field Office: Canada', '(416) 677-1000');

insert into department
  values ('600', 'Engineering', '(408) 555-123'); -- нарушение условия check

select * from department
  where phone not similar to '\([0-9]{3}\) 555\-%' escape '\';
      

Поддержка шестнадцатеричных литералов

Билл Оливер

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-1760.

Добавлена поддержка шестнадцатеричных числовых и строковых литералов.

Синтаксис

<числовой шестнадцатеричный литерал>  ::= { 0x | 0X } <шестнадцатеричный знак> [ <шестнадцатеричный знак>... ]

<строковой шестнадцатеричный литерал> ::= { x | X } <апостроф> [ { <шестнадцатеричный знак> }... ] <апостроф>

<шестнадцатеричный знак> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | a | b | c | d | e | f
      

Числовые шестнадцатеричные литералы

  • Количество шестнадцатеричных знаков в строке не может быть больше 16.

  • Если количество шестнадцатеричных знаков больше 8, константа имеет тип данных BIGINT, иначе - тип данных INTEGER. Т.е., например, 0xF0000000 - это -268435456, а 0x0F0000000 равно 4026531840.

Строковые шестнадцатеричные литералы

Строка будет иметь тип данных CHAR(n/2) CHARACTER SET OCTETS, где n - количество шестнадцатеричных знаков.

Примеры

select 0x10, cast('0x0F0000000' as bigint)
  from rdb$database;
  
select x'4669726562697264'
  from rdb$database;

select x'CFF0E8E2E5F22C20F7E8F2E0F2E5EBFC21'
  from rdb$database;
      

Новые функции конвертирования UUID (GUID)

Адриано дос Сантос Фернандес

Ссылки в трекере: CORE-1656 и CORE-1682.

Добавлены две новые встроенные функции (UUID_TO_CHAR и CHAR_TO_UUID), позволяющие преобразование UUID (GUID) между форматом CHAR(16) OCTETS и форматом RFC4122.

CHAR_TO_UUID()

Функция CHAR_TO_UUID() преобразовывает UUID (GUID), представленный в формате CHAR(32) ASCII (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX), в формат CHAR(16) OCTETS, оптимизированный для хранения.

Синтаксис

CHAR_TO_UUID( <строка> )
        

Пример

select char_to_uuid('93519227-8D50-4E47-81AA-8F6678C096A1')
  from rdb$database;
        

UUID_TO_CHAR()

Функция UUID_TO_CHAR() преобразовывает UUID (GUID), представленный в формате CHAR(16) OCTETS (как результат функции GEN_UUID()), в формат CHAR(32) ASCII (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX).

Syntax Model

UUID_TO_CHAR( <строка> )
        

Example

select uuid_to_char(gen_uuid())
  from rdb$database;
        

Поддержка нетипизированных параметров в предикате IS NULL

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-2298

По многочисленным просьбам (в частности, от программистов, использующих Delphi) добавлена возможность использовать «один и тот же» параметр как условие фильтра по полю таблицы и проверять его (параметр) на равенство NULL. Это позволяет разработчикам клиентских приложений (использующим Delphi и другие языки программирования) использовать «отключаемые фильтры» (т.е. условия с использованием параметров, которые «отключаются» присвоением параметру NULL), т.е. использовать запросы следующего типа:

  WHERE col1 = :param1 OR :param1 IS NULL
      

На уровне API этот запрос преобразовывается в следующий:

  WHERE col1 = ? OR ? IS NULL
      

Вследствие чего возникает две проблемы:

  1. В то время как разработчик рассматривает параметр :param1 как одну переменную с двумя «ссылками», на уровне API запрос содержит два отдельных и независимых параметра.

  2. Тип второго параметра неизвестен и сервер не может его самостоятельно определить.

Для решения этих проблем специально для предиката «? is NULL» добавлен новый тип данных SQL_NULL. Работает это следующим образом:

  • Если параметр «param1» не равен NULL, клиентская библиотека доступа должна присвоить параметру нужное значение и установить поле XSQLVAR.sqlind в NOT NULL.

  • Если параметр равен NULL, клиентская библиотека доступа должна присвоить полю XSQLVAR.sqlind обоих параметров значение NULL и «очистить» (присвоить NULL) поле XSQLVAR.sqldata.

Иными словами, для параметра ( ? ) в предикате ? IS NULL

:
  • Поле XSQLVAR.sqlind должно быть установлено в соответствии с NULL/не-NULL состоянием параметра.

  • Поле XSQLVAR.sqldata параметра с типом SQL_NULL всегда должно быть пустым (NULL).

NULL в выходных параметрах

Если запрос возвращает константу NULL (например, select NULL from ...), поле результирующего набора данных будет иметь тип CHAR(1), а не SQL_NULL. Но это может быть изменено в следующих версиях.

Расширение функции LIST()

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-1453

Добавлена возможность в функции LIST() использовать строковое выражение в качество разделителя.

Синтаксис

<Функция LIST> ::= LIST '(' [ { ALL | DISTINCT } ] <выражение> [ ',' <разделитель> ] ')'

<разделитель>  ::= любое строковое выражение
      

Замечание

Если разделитель не указан, то в качестве разделителя будет использована запятая.

Пример

SELECT
  DISCUSSION_ID,
  LIST(COMMMENT, ASCII_CHAR(13))
FROM COMMENTS
  GROUP BY DISCUSSION_ID;
      

Усовершенствования оптимизатора

В оптимизаторе сделаны следующие усовершенствования:

CROSS JOIN

Ссылка в трекере: CORE-2200.

При выполнении операции CROSS JOIN с пустой таблицей оптимизатор немедленно возвращает пустой набор данных.

Замечание

Это усовершенствование добавлено и в версию 2.1.2.

Производные таблицы (derived tables)

Ссылка в трекере: CORE-2029.

Увеличено максимальное количество контекстов для производных таблиц.

Отложенное вычисление DEFAULT-значения

Ссылка в трекере: CORE-1842.

В некоторых случаях преждевременное вычисление значения или выражения, указанного в качестве DEFAULT для поля таблицы, может привести к путанице в отношении правильности значения, указанного при вставке (INSERT) для этого поля. Усовершенствование состоит в том, что DEFAULT-выражение не вычисляется - до тех пор, пока это не станет необходимо (т.е. до попытки вставки записи, без присвоения значения этому полю).

Использование индекса для NOT IN

Ссылка в трекере: CORE-1137.

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

Утечка памяти в Undo Log

Ссылка в трекере: CORE-1477.

При большом количестве операций UPDATE в одной и той же транзакции был возможен чрезмерный расход памяти в Undo log. Потребление памяти уменьшено в версии 2.5.

Другие усовершенствования

Другие изменения и исправления:

Обнаружение некорректных UDF-функций, объявленных с помощью FREE_IT

Ссылка в трекере: CORE-1937.

Ранее, функция UDF, объявленная с помощью FREE_IT, могла вызвать падение сервера, если память была выделена не функцией ib_util_malloc(). Теперь подобные ситуации корректно обнаруживаются и обрабатываются, но выделенная память остается неосвобожденной.

Дополнительная информация при ошибке «Expression evaluation not supported»

Ссылка в трекере: CORE-1799.

Добавлены новые GDS-коды (и тексты ошибок) для обеспечения более подробной информации при возникновении ошибки «Expression evaluation not supported». Например:

  'Argument for @1 in dialect 1 must be string or numeric'
  'Strings cannot be added to or subtracted from DATE or TIME types'
  'Invalid data type for subtraction involving DATE, TIME or TIMESTAMP types'
   и т.д.
            

Эта информация следует после GDS-кода в статус-векторе (status vector) ошибки isc_expression_eval_err (expression evaluation not supported).

Процедурный язык (PSQL)

В процедурный язык (PSQL) Firebird (используемый в триггерах, хранимых процедурах и динамически выполняемых блоках) внесено несколько существенных изменений; наиболее важные - новые возможности оператора EXECUTE STATEMENT и автономные транзакции.

Автономные транзакции

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-1409

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

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

Внимание

Поскольку автономная транзакция независима от запустившей ее транзакции, нужно очень осторожно использовать эту функциональность во избежание блокировок (deadlocks).

Синтаксис

IN AUTONOMOUS TRANSACTION
DO
  <простой оператор | составной оператор>
    

Пример использования

create table log (
  logdate timestamp,
  msg varchar(60)
);

create exception e_conn 'Connection rejected';

set term !;

create trigger t_conn on connect
as
begin
  if (current_user = 'BAD_USER') then
  begin
    in autonomous transaction
    do
    begin
      insert into log (logdate, msg) values (current_timestamp, 'Connection rejected');
    end

    exception e_conn;
  end
end!

set term ;!
    

Использование типа поля таблицы для переменной PSQL

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-1356

В версии 2.0 появилась возможность использования доменов в качестве типов переменных в PSQL. Теперь стало возможным для этих целей использовать тип поля таблицы или представления.

Синтаксис

    data_type ::=
         <builtin_data_type>
       | <domain_name>
       | TYPE OF <domain_name>
       | TYPE OF COLUMN <table or view>.<column>
    

Замечание

TYPE OF COLUMN получает только тип поля. Любые ограничения (constraints) или значения по умолчанию этого поля игнорируются.

Примеры

CREATE TABLE PERSON (
  ID INTEGER,
  NAME VARCHAR(40)
  );

CREATE PROCEDURE SP_INS_PERSON (
  ID TYPE OF COLUMN PERSON.ID,
  NAME TYPE OF COLUMN PERSON.NAME
  )
  AS
DECLARE VARIABLE NEW_ID TYPE OF COLUMN PERSON.ID;
BEGIN
  INSERT INTO PERSON (ID, NAME)
    VALUES (:ID, :NAME)
    RETURNING ID INTO :NEW_ID;
END
    

Расширение оператора EXECUTE STATEMENT

В начале этой главы дается подробное описание нового расширенного синтаксиса PSQL-оператора EXECUTE STATEMENT, а далее описываются новые возможности и особенности их использования.

[FOR] EXECUTE STATEMENT <query_text> [(<входные параметры>)]
    [ON EXTERNAL [DATA SOURCE] <строка соединения>]
    [WITH {AUTONOMOUS | COMMON} TRANSACTION]
    [AS USER <имя пользователя>]
    [PASSWORD <пароль>]
    [ROLE <роль>]
    [WITH CALLER PRIVILEGES]
    [INTO <переменные>]
    

Замечание

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

Особенности использования

Если не указаны предложения ON EXTERNAL DATA SOURCE и AS USER, то оператор EXECUTE STATEMENT будет выполнен в контексте текущего соединения (CURRENT_CONNECTION). В остальных случаях оператор будет выполнен в отдельном соединении.

Аутентификация

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

  1. На платформе Windows для запросов в текущем соединении (т.е. CURRENT_CONNECTION, без обращения к внешним источникам данных) будет использована Trusted Authentication, если она уже используется в текущем соединении и параметр <имя пользователя> не указан, равен Null или совпадает с CURRENT_USER.

  2. Если используется соединение с внешним источником данных и параметр <строка соединения> указывает на текущую базу данных (CURRENT_CONNECTION), то будет использована учетная запись текущего пользователя (CURRENT_USER).

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

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

Режим работы транзакции

В новом синтаксисе есть необязательное предложение, позволяющее управлять транзакцией, в которой будет выполняться оператор: WITH COMMON | AUTONOMOUS TRANSACTION, режим WITH COMMON TRANSACTION используется по умолчанию.

Поведение оператора при использовании WITH COMMON TRANSACTION будет следующим:

  1. При соединении с внешним источником данных:

    • при первом (в контексте текущей транзакции) соединении с внешним источником данных будет запущена новая транзакция с такими же параметрами (уровень изоляции и т.д.), как у текущей транзакции (CURRENT_TRANSACTION);

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

  2. При выполнении оператора в контексте текущего соединения будет использована текущая транзакция (CURRENT_TRANSACTION).

При использовании предложения WITH AUTONOMOUS TRANSACTION оператор всегда будет выполняться в новой транзакции, запущенной с такими же параметрами, как у текущей транзакции (CURRENT_TRANSACTION). Эта транзакция будет подтверждена, если оператор выполнится без ошибок, или отменена, если во время выполнения оператора возникли ошибки.

Наследование привилегий

Владислав Хорсун

Ссылка в трекере: CORE-1928

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

Добавление необязательного предложения WITH CALLER PRIVILEGES позволяет выполняемому коду (оператору EXECUTE STATEMENT) наследовать привилегии доступа вызвавшей его хранимой процедуры или триггера. При подготовке (prepare) оператора будут учитываться все имеющиеся привилегии хранимой процедуры или триггера. Результат будет таким же, как если бы исполняемый оператор был вызван хранимой процедурой или триггером непосредственно (т.е. без оператора EXECUTE STATEMENT).

Важно

Предложение WITH CALLER PRIVILEGES не может использоваться совместно с предложением ON EXTERNAL DATA SOURCE.

Запросы к внешним базам данных

Владислав Хорсун

Ссылка в трекере: CORE-1853

Оператор EXECUTE STATEMENT теперь позволяет выполнять запросы к внешним базам данных с помощью предложения ON EXTERNAL DATA SOURCE.

Параметр <строка соединения>

Параметр <строка соединения> представляет собой обычную строку соединения с базой данных, аналогично передаваемой в API-функцию isc_attach_database(), и имеет следующий формат:

   [ <имя сервера> [ / <номер порта> ] : ] <путь к базе данных>
        

Набор символов

Соединение с внешней базой данных использует тот же самый набор символов, что и в текущем соединении (CURRENT_CONNECTION).

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

Если внешний источник данных находится на другом сервере, то предложения AS USER <имя пользователя> и PASSWORD <пароль> являются обязательными, а предложение ROLE <роль> является опциональным. Предложение WITH CALLER PRIVILEGES недопустимо, если внешний источник данных находится на другом сервере.

Замечание

В версии 2.5 нет возможности использовать двухфазные транзакции для внешних соединений.

Использование внешнего соединения

При использовании предложения ON EXTERNAL [ DATA SOURCE ], параметр <строка соединения> которого содержит значение отличное от Null, оператор всегда будет выполняться в отдельном соединении (отличном от CURRENT_CONNECTION) – независимо от того, с какой базой данных и на каком сервере происходит соединение. Кроме того, внешнее соединение будет установлено и при выполнении оператора EXECUTE STATEMENT с использованием предложения AS USER, параметр <имя пользвоателя> которого отличается от CURRENT_USER.

Установленное внешнее соединение будет «жить» (т.е. существовать и при необходимости использоваться) до тех пор, пока существует хотя бы одна транзакция, использующая его, и закрывается независимо от способа завершения последней транзакции – COMMIT или ROLLBACK. Если последняя транзакция, использующая внешнее соединение, подтверждается с помощью CommitRetaining или отменяется с помощью RollbackRetaining, то внешнее соединение не закрывается.

Все локальные коннекты к серверу (в рамках одного процесса сервера) используют общий пул внешних соединений, т.е. установленные внешние соединения могут повторно использоваться. При этом, если оператор EXECUTE STATEMENT выполняется в режиме WITH COMMON TRANSACTION, возможно также повторное использование транзакции – подробнее читайте раздел Режим работы транзакции.

Внешние соединения с одной и той же базой данных на одном и том же сервере, но с разной строкой соединения (параметром предложения ON EXTERNAL), считаются разными соединениями – т.е. при использовании разных протоколов, портов, имен или IP-адресов сервера, а также алиасов баз данных – будут установлены отдельные внешние соединения. При соединении с внешним источником с одной и той же строкой соединения, но под разными учетными записями (AS USER), также будут созданы отдельные внешние соединения.

EXECUTE STATEMENT с динамическими параметрами

Владислав Хорсун

Александр Пешков

Ссылка в трекере: CORE-1221

Новые расширения позволяют использовать оператор EXECUTE STATEMENT с динамическими параметрами аналогично параметризованному DSQL-оператору. Текст самого запроса тоже может быть передан в качестве параметра.

Синтаксис

Механизм использует некоторые соглашения, чтобы облегчить парсинг (синтаксический разбор) запроса и дать возможность использования именованных параметров в стиле аналогично некоторым популярным клиентским инструментам (типа Delphi). Родной синтаксис API, использующий неименованные параметры в указанном порядке, тоже поддерживается. Но совместное использование именованных и неименованных параметров невозможно.

Новый оператор связывания

При реализации поддержки динамических параметров появилась необходимость ввести новый оператор присваивания для связывания во время выполнения именованных параметров с их значениями. Новый оператор подобен оператору присваивания в языке Pascal: «:=».

Синтаксис присвоения параметрам значений
    <входные параметры> ::=
      <именованный параметр> | <входные параметры>, <именованный параметр>

    <именованный параметр> ::=
      <имя параметра> := <выражение>
          

Пример использования именованных входных параметров

Следующий PSQL-блок передает текст запроса через параметр и использует именованные входные параметры:

EXECUTE BLOCK AS
  DECLARE S VARCHAR(255);
  DECLARE N INT = 100000;
  BEGIN
  /* Обычное присвоение текста запроса строковой переменной */
    S = 'INSERT INTO TTT VALUES (:a, :b, :a)';

    WHILE (N > 0) DO
    BEGIN
      /* Каждая итерация цикла передает текст запроса и
         связывает значения с именованными параметрами */

      EXECUTE STATEMENT (:S) (a := CURRENT_TRANSACTION, b := CURRENT_CONNECTION)
      WITH COMMON TRANSACTION;
      N = N - 1;
    END
  END
          

Пример использования неименованных входных параметров

Следующий PSQL-блок использует неименованные входные параметры и передает их значения непосредственно по порядку:

EXECUTE BLOCK AS
  DECLARE S VARCHAR(255);
  DECLARE N INT = 100000;
  BEGIN
    S = 'INSERT INTO TTT VALUES (?, ?, ?)';

    WHILE (N > 0) DO
    BEGIN
      EXECUTE STATEMENT (:S) (CURRENT_TRANSACTION, CURRENT_CONNECTION, CURRENT_TRANSACTION);
      N = N - 1;
    END
  END
          

Замечание

Обратите внимание, что если текст запроса передается через параметр и одновременно используюся динамические параметры, то текст запроса должен быть заключен в скобки:

    EXECUTE STATEMENT (:sql) (p1 := 'abc', p2 := 0) ...
            

Примеры использования EXECUTE STATEMENT

Следующие примеры демонстрируют различные варианты применения новых возможностей оператора EXECUTE STATEMENT.

Тесты соединений и транзакций

Повторное использование соединений и транзакций

Выполните этот PSQL-блок несколько раз в одной и той же транзакции – он создает три новых соединения к текущей базе данных и повторно использует их при каждом следующем вызове. Транзакции также используются повторно.

EXECUTE BLOCK
  RETURNS (CONN INT, TRAN INT, DB VARCHAR(255))
AS
  DECLARE I INT = 0;
  DECLARE N INT = 3;
  DECLARE S VARCHAR(255);
BEGIN
  SELECT A.MON$ATTACHMENT_NAME FROM MON$ATTACHMENTS A
   WHERE A.MON$ATTACHMENT_ID = CURRENT_CONNECTION
    INTO :S;

  WHILE (i < N) DO
  BEGIN
    DB = TRIM(CASE i - 3 * (I / 3)
      WHEN 0 THEN '\\.\' WHEN 1 THEN 'localhost:' ELSE '' END) || :S;

    FOR EXECUTE STATEMENT
      'SELECT CURRENT_CONNECTION, CURRENT_TRANSACTION
      FROM RDB$DATABASE'
      ON EXTERNAL :DB
      AS USER 'sysdba' PASSWORD 'masterkey' -- просто пример
      WITH COMMON TRANSACTION
      INTO :CONN, :TRAN
    DO SUSPEND;

    i = i + 1;
  END
END
          
Открытие нового соедиения

Выполните этот PSQL-блок несколько раз в одной и той же транзакции – он создает три новых соединения с текущей базой данных при каждом вызове.

EXECUTE BLOCK
  RETURNS (CONN INT, TRAN INT, DB VARCHAR(255))
AS
  DECLARE I INT = 0;
  DECLARE N INT = 3;
  DECLARE S VARCHAR(255);
BEGIN
  SELECT A.MON$ATTACHMENT_NAME
    FROM MON$ATTACHMENTS A
  WHERE A.MON$ATTACHMENT_ID = CURRENT_CONNECTION
   INTO :S;

  WHILE (i < N) DO
  BEGIN
    DB = TRIM(CASE i - 3 * (I / 3)
      WHEN 0 THEN '\\.\'
      WHEN 1 THEN 'localhost:'
      ELSE '' END) || :S;

    FOR EXECUTE STATEMENT
    'SELECT CURRENT_CONNECTION, CURRENT_TRANSACTION FROM RDB$DATABASE'
      ON EXTERNAL :DB
      WITH AUTONOMOUS TRANSACTION -- обратите внимание на автономную транзакцию
      INTO :CONN, :TRAN
    DO SUSPEND;

    i = i + 1;
  END
END
          

Пример вычисления входного параметра

Демонстрация того, что выражение вычисляется только один раз:

EXECUTE BLOCK
  RETURNS (A INT, B INT, C INT)
AS
BEGIN
  EXECUTE STATEMENT (
    'SELECT CAST(:X AS INT),
            CAST(:X AS INT),
            CAST(:X AS INT)
       FROM RDB$DATABASE')
      (x := GEN_ID(G, 1))
    INTO :A, :B, :C;

  SUSPEND;
END
        

Тестирование скорости вставки записей

Циклическое выполнение вышеприведенных примеров использования входных параметров для сравнения с непараметризованной формой оператора EXECUTE STATEMENT:

RECREATE TABLE TTT (
  TRAN INT,
  CONN INT,
  ID INT);

-- Прямая вставка записей:

EXECUTE BLOCK AS
  DECLARE N INT = 100000;
BEGIN
  WHILE (N > 0) DO
  BEGIN
    INSERT INTO TTT VALUES (CURRENT_TRANSACTION, CURRENT_CONNECTION, CURRENT_TRANSACTION);
    N = N - 1;
  END
END

-- Вставка записей с помощью подготовленного динамического
-- оператора с использованием именованных входных параметров:

EXECUTE BLOCK AS
  DECLARE S VARCHAR(255);
  DECLARE N INT = 100000;
BEGIN
  S = 'INSERT INTO TTT VALUES (:a, :b, :a)';

  WHILE (N > 0) DO
  BEGIN
    EXECUTE STATEMENT (:S)
      (a := CURRENT_TRANSACTION, b := CURRENT_CONNECTION)
    WITH COMMON TRANSACTION;
    N = N - 1;
  END
END

-- Вставка записей с помощью подготовленного динамического
-- запроса с использованием неименованных входных параметров:

EXECUTE BLOCK AS
DECLARE S VARCHAR(255);
DECLARE N INT = 100000;
BEGIN
  S = 'INSERT INTO TTT VALUES (?, ?, ?)';

  WHILE (N > 0) DO
  BEGIN
    EXECUTE STATEMENT (:S) (CURRENT_TRANSACTION, CURRENT_CONNECTION, CURRENT_TRANSACTION);
    N = N - 1;
  END
END
        

Использование подзапросов в PSQL-выражениях

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-2580

Появилась возможность использовать подзапросы в PSQL-выражениях (ранее для этого приходилось использовать SELECT...INTO и промежуточную переменную). Примеры:

var = (select ... from ...);
if ((select ... from ...) = 1) then
if (1 = any (select ... from ...)) then
if (1 in (select ... from ...)) then
      

Интернациональная языковая поддержка (INTL)

Адриано дос Сантос Фернандес

В Firebird 2.5 были добавлены некоторые усовершенствования, направленные на улучшение интернациональной языковой поддержки.

Параметр COLLATION для базы данных

Базы данных с версией ODS 11.2 и выше теперь могут быть созданы с последовательностью сортировки (collation), связанной с набором символов по умолчанию. Подробности описаны в разделе Параметр COLLATION для базы данных.

Оператор ALTER CHARACTER SET

Синтаксис языка DDL был дополнен возможностью указания последовательности сортировки (collation) по умолчанию для набора символов на уровне базы данных. Подробности описаны в разделе Оператор ALTER CHARACTER SET.

Кодировка строки соединения

В параметры соединения с базой данных (DPB) добавлен параметр, указывающий кодировку (набор символов) строки соединения, что позволяет без проблем соединяться с базами данных, названия файлов которых содержат не-ASCII символы.

Прочитайте раздел Кодировка строки соединения - даже если не сталкивались с такими проблемами.

Другие усовершенствования

Использование маркера набора символов

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

Проблемы могли возникнуть в двух случаях:

  1. Один запрос использует маркер набора символов, в то время как другой запрос читает данные из таблицы MON$STATEMENTS

  2. Маркер набора символов используется в PSQL-модуле

В качестве обходного решения этих проблем можно использовать шестнадцатеричное представление ASCII-символов с маркером. Например, вместо

select _dos850 '123áé456' from rdb$database
      

можно написать

select _dos850 X'313233A082343536' from rdb$database
      

Запрет на некорректные UNICODE_FSS символы

Ссылка в трекере: CORE-1600

Некорректные символы больше не допускаются в данных UNICODE_FSS полей.

Новые ключи для исправления некорректных строк

В утилиту gbak добавлены новые ключи для исправления некорректных данных и метаданных в кодировке UNICODE_FSS. Более подробное описание приведено в разделе gbak.

Числовая сортировка строк

Ссылка в трекере: CORE-1945

Для последовательностей сортировки (collation) набора символов UNICODE можно указать параметр NUMERIC-SORT, который задает численный порядок сортировки строк.

Синтаксис и примеры использования:

NUMERIC-SORT={0 | 1}

По умолчанию используется значение 0, обозначающее обычную сортировку в алфавитном порядке:

    1
    10
    100
    2
    20
      

Значение 1 устанавливает сортировку в числовом порядке:

    1
    2
    10
    20
    100
      

Пример создания collation:

create collation unicode_num for utf8
from unicode 'NUMERIC-SORT=1';
      

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

UNICODE_CI_AI

Ссылка в трекере: CORE-824

Для набора символов UNICODE добавлена последовательность сортировки (collation) UNICODE_CI_AI, не зависящая от регистра и диакритических знаков.

WIN_1258

Ссылка в трекере: CORE-2185

Для набора символов WIN1258 добавлен псевдоним WIN_1258 для соответствия с остальными наборами символов WIN*.

Наборы символов SJIS и EUCJ

Ссылка в трекере: CORE-2103

Строки в наборах символов SJIS и EUCJ теперь проверяются на корректность.

GB18030

Ссылка в трекере: CORE-2636

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

Утилиты командной строки

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

Чтобы 32-битные утилиты могли работать с 64-битным сервером, были добавлены новые API-функции и структуры (struct perf64 и perf64_xxx) и изменены утилиты isql и qli для поддержки нового API. Это значит, что утилиты isql и qli версии 2.5 несовместимы с более старыми версиями клиентских библиотек.

Более подробное описание приведено в разделе Корректная обработка 64-битных значений в функциях получения статистики.

fbtracemgr

Владислав Хорсун

Ссылка в трекере: CORE-2524

Это новая утилита для работы с новыми возможностями трассировки и аудита. Формат вызова утилиты следующий:

  fbtracemgr <команда> [<параметры>]
    

Команды:

 -STA[RT]     запуск новой сессии
 -STO[P]      остановка сессии
 -SU[SPEND]   приостановка сессии
 -R[ESUME]    возобновление сессии
 -L[IST]      отображение списка сессий
    

Параметры команд:

 -N[AME]     <string>  имя сессии
 -I[D]       <number>  ID сессии
 -C[ONFIG]   <string>  конфигурационный файл сесии
    

Параметры соединения:

 -SE[RVICE]  <string>  имя сервиса
 -U[SER]     <string>  имя пользователя
 -P[ASSWORD] <string>  пароль
 -FE[TCH]    <string>  считать пароль из файла
 -T[RUSTED]  <string>  использовать Trusted Authentication
    

Примеры:

 fbtracemgr -SE remote_host:service_mgr -USER SYSDBA -PASS masterkey -LIST
 fbtracemgr -SE service_mgr -START -NAME my_trace -CONFIG my_cfg.txt
 fbtracemgr -SE service_mgr -SUSPEND -ID 2
 fbtracemgr -SE service_mgr -RESUME -ID 2
 fbtracemgr -SE service_mgr -STOP -ID 4
    

Примечания

  1. Все команды и параметры регистронезависимы.

  2. Чтобы выйти из сессии трассировки нажмите Ctrl-C.

Считывание пароля из файла

Александр Пешков

Все утилиты с параметром -password уязвимы для перехвата пароля, особенно если запускаются из скрипта. Начиная с версии 2.1, в списке процессов на платформах POSIX пароль отображается звездочками ( * ), что уже было лучше, чем отображать его в открытом виде.

Следующим шагом на пути скрытия пароля от чужих глаз стала возможность считывания пароля из файла или (на платформах POSIX) из входного потока STDIN.

Новый параметр -fetch_password

В версии 2.5 добавлен новый параметр -fet[ch_password], который можно использовать вместо параметра -pa[ssword] во всех утилитах командной строки, требующих аутентификации.

Важно

  1. Утилита qli поддерживает только сокращенное название параметра «-F».

  2. Параметр -fet[ch_password] не может быть использован для замены параметра -pw утилиты gsec.

Использование -fetch_password

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

  isql -user sysdba -fet passfile server:employee
        

считывает первую строку файла «passfile» в текущем каталоге и использует ее в качестве пароля.

В качестве имени файла можно указать «stdin»:

  isql -user sysdba -fet stdin server:employee
        

При вызове из командной строки такой команды будет запрошен пароль:

  Enter password:
        

Подсказка

На платформе POSIX запрос пароля появится также при указании в качестве файла «/dev/tty». Это может быть удобно, например, при восстановлении (restore) из stdin (все в одной строке):

  bunzip2 -c emp.fbk.bz2 | gbak -c stdin /db/new.fdb
     -user sysdba -fetch /dev/tty
          

gsec

Управление выдачей прав администраторам Windows

Александр Пешков

В версии 2.1 на платформе Windows администраторы домена автоматически получали привилегии SYSBDA. В версии 2.5 администраторы домена получают привилегии SYSBDA автоматически, только если сделана соответствующая настройка в системной базе данных пользователей.

В главе «Возможности администрирования» приведено подробное описание новой системной роли RDB$ADMIN и оператора ALTER ROLE, который позволяет SYSDBA включить или выключить автоматическою выдачу прав на роль RDB$ADMIN администраторам Windows (в том числе в системной базе данных пользователей, к которой происходит неявное обращение при создании/изменении/удалении пользователей).

Автоматической выдачей администраторам Windows прав на роль RDB$ADMIN можно также управлять с помощью утилиты gsec с помощью нового параметра -mapping.

Mapping an OS Administrator to the RDB$ADMIN Role

Новый параметр -mapping предназначен для включения или выключения автоматической выдачи прав на роль RDB$ADMIN в системной базе данных пользователей администраторам Windows. У параметра только один аргумент: set (для включения) или drop (для выключения):

  -mapping {set | drop}
        

Выдача прав на роль RDB$ADMIN пользователям Firebird

С появлением системной роли RDB$ADMIN появилась возможность наделения пользователей Firebird привилегиями SYSDBA. Однако, ни один пользователь (даже SYSDBA) не может подключаться к системной базе данных пользователей для управления пользователями. Но в операторах CREATE USER и ALTER USER есть предложение GRANT ADMIN ROLE, которое позволяет пользователю с привилегиями SYSDBA выдать другому пользователю права на роль RDB$ADMIN.

То же самое можно сделать с помощью параметра -admin утилиты gsec. У этого параметра есть только один аргумент YES (чтобы выдать указанному пользователю права на роль RDB$ADMIN в базе данных security2.fdb) или NO (чтобы забрать права):

  -admin {YES | NO}
        

Консольная справка для gsec

Клаудио Вальдеррама

Ссылка в трекере: CORE-756

У утилиты gsec появились два новых параметра для вызова справки: -help и -?.

fbsvcmgr

В утилиту fbsvcmgr и Service Parameter Block (SPB) внесены изменения в соответствии с новыми возможностями gsec.

  • по аналогии с gsec -mapping добавлены два новых параметра: isc_action_svc_set_mapping и isc_action_svc_drop_mapping

  • по аналогии с gsec -admin новый параметр isc_spb_sec_admin типа spb_long со значением 0 (REVOKE ADMIN ROLE) или любым другим значением (GRANT ADMIN ROLE).

Подробное описание роли RDB$ADMIN приведено в разделе Новая системная роль RDB$ADMIN.

gbak

Параметры для исправления некорректных строк

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-1831

У утилиты gbak появились два новых параметра для исправления некорретных строк (в данных и метаданных) в кодировке UNICODE_FSS при восстановлении базы данных из резервной копии (restore).

Синтаксис:

  -FIX_FSS_DATA <кодировка>     -- исправить некорректные данные
  -FIX_FSS_METADATA <кодировка> -- исправить некорректные метаданные
      

Подсказка

CORE-2754

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

Сохранение параметра Collation для наборов символов

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-789

Последовательность сортировки (сollation), используемая по умолчанию для набора символов (хранится в поле RDB$DEFAULT_COLLATE_NAME таблицы RDB$CHARACTER_SETS) сохраняется после цикла резервного копирования и восстановления (backup/restore).

nBackup

Ссылка в трекере: CORE-2316

На платформе POSIX создание с помощью утилиты nBackup полной резервной копии большой по размеру базы данных вызывало большой объем дискового ввода/вывода (I/O), что могло мешать работе пользователей. Теперь nBackup сначала пытается считать данные из кеша операционной системы до чтения данных с диска, что значительно снижает объем дискового ввода/вывода.

Замечание

В результате этого нововведения время создания полной резервной копии в условиях высокой нагрузки может возрасти на 10-15%.

isql

Коды SQLSTATE вместо SQLCODE

Клаудио Вальдеррама

Утилита isql теперь возвращает коды завершения SQLSTATE вместо кодов SQLCODE, которые теперь являются устаревшими. Более подробное описание приведено в разделе Поддержка кодов завершения SQLSTATE.

Изменен вывод чисел в экспоненциальной форме

Клаудио Вальдеррама

Ссылка в трекере: CORE-1171

Утилита isql на платформах Windows и POSIX выводила разное количество цифр в экспоненциальной части числа. По умолчанию компиляторы от Microsoft и Intel дополняют экспоненциальную часть ведущим нулем до трех знаков. Например:

  select cast ('-2.488355210669293e+39' as double precision)
    from rdb$database;
      
  • В POSIX будет выведено -2.488355210669293e+39

  • В Windows выводилось -2.488355210669293e+039

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

Справка по команде SHOW COLLATIONS

Адриано дос Сантос Фернандес

В справку утилиты isql добавлена информация о команде SHOW COLLATIONS.

Ссылка в трекере: CORE-2432

gpre (Precompiler)

Новые функции и переменные

Стефен Бойд

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-1527

GPRE теперь поддерживает предикат IS NOT DISTINCT, функции CASE, NULLIF, COALESCE, SUBSTRING и контекстные переменные CURRENT_*.

Устаревшие функции

В связи ожидаемым с удалением функции isc_ddl в Firebird 3.0, некоторые возможности, существующие в утилитах gdef и gpre, объявляются устаревшими, т.е. они будут работать в версии 2.5, но не будут работать в Firebird 3. Более подробное описание приведено в главе Совместимость.

gstat

Клаудио Вальдеррама

Ссылка в трекере: CORE-1411

Утилита gstat теперь поддерживает параметры -? и -help для вызова справки по командам и параметрам.

Руководство по установке и миграции

Содержание

Linux (POSIX)
Windows

Руководство по установке и миграции

Последняя версия Руководства по установке и миграции для версий 2.0 и 2.1 применима и для версии 2.5. Если этот файл отсутствует в подкаталоге «doc», Вы можете скачать его с сайта Firebird.

Linux (POSIX)

В установке на платформе POSIX были сделаны следующие изменения:

Усовершенствование инсталляционных скриптов

Александр Пешков

  • CORE-2195: Скрипты установки для архитектуры Classic Server были усовершенствованы в части назначения прав доступа к документации и другим компонентам.

  • CORE-2392: Скрипты инсталляции для архитектур Superserver и SuperClassic для всех поддерживаемых POSIX-систем были усовершенствованы в части установки и настройки Guardian-а.

  • CORE-2626: Скрипты автозагрузки в /etc/init.d не учитывали наличие в системе каталогов /var/run/firebird и /tmp/firebird, вследствие чего могли возникать различные ошибки при загрузке системы. В версии 2.5 и выше эти ошибки исправлены.

Ключи для configure

Александр Пешков

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

Доступные ключи

  --with-fbbin - каталог исполняемых файлов (PREFIX/bin)
  --with-fbsbin - каталог системных исполняемых файлов (PREFIX/bin)
  --with-fbconf - каталог файлов конфигурации (PREFIX)
  --with-fblib - каталог файлов библиотек (PREFIX/lib)
  --with-fbinclude - каталог заголовочных файлов C/C++ (PREFIXinclude)
  --with-fbdoc - корневой каталог документации (PREFIX/doc)
  --with-fbudf - каталог библиотек UDF (PREFIX/UDF)
  --with-fbsample - каталог файлов примеров (PREFIX/examples)
  --with-fbsample-db - каталог базы данных примеров (PREFIX/examples/empbuild)
  --with-fbhelp - каталог справки к утилите QLI (PREFIX/help)
  --with-fbintl - каталог файлов языковой поддержки (PREFIX/intl)
  --with-fbmisc - каталог дополнительных файлов (PREFIX/misc)
  --with-fbsecure-db - каталог базы данных пользователей (PREFIX)
  --with-fbmsg - каталог базы данных сообщений (PREFIX)
  --with-fblog - каталог файлов журналов и логов (PREFIX)
  --with-fbglock - каталог файлов блокировки Guardian (PREFIX)
  --with-fbplugins - каталог plugin-библиотек (PREFIX)
          

Обнаружение исполняемых файлов Firebird

Адриано дос Сантос Фернандес

Ссылка в трекере: CORE-2398

На платформе POSIX обнаружение каталога установки исполняемых файлов Firebird теперь выполняется корректно.

Важно

На данный момент это экспериментальная функциональность. Она отключена в официальных дистрибутивах. Чтобы включить ее, скомпилируйте Firebird из исходных кодов файлом autogen.sh c использованием ключа --enable-binreloc.

Windows

Владислав Хорсун

Ссылка в трекере: CORE-2243

Замечание

Изменения были также внесены в версию 2.1.2, поэтому также описаны в документе «Установка и миграция».

Управление библиотеками MSCV8-runtime

Firebird 2.5 скомпилирован компилятором Microsoft MSVC8 из Visual Studio 2005. Поскольку исполняемые файлы Firebird используют динамическое связывание, они требуют наличия run-time библиотек. Во избежание «Ада DLL» Microsoft ввела новые правила распространения run-time библиотек. Начиная с Windows XP, run-time библиотеки (msvcp80.dll, msvcr80.dll и mscvcm80.dll) могут распространяться либо как общие библиотеки для всей системы, либо отдельно для каждого приложения.

  • Инсталлятор Microsoft MSI Installer устанавливает run-time библиотеки в специальный общий для всех каталог SxS, доступный для использования всеми приложениями.

  • Второй способ распространения - вместе с приложениями, т.е. файлы run-time библиотек должны распологаться в каталоге исполняемых файлов. Использование каталога \system32 для файлов run-time библиотек запрещено в операционных системах Windows XP, Server2003 и Vista.

Установка библиотек на уровне системы

Чтобы установить runtime-библиотеки общими для всех приложений, в операционной системе должен быть установлен MSI 3.0 и у пользователя должны быть административные привилегии. Но при распространении приложений с Firebird Embedded это может быть невозможно, поскольку требуется работоспособность приложения без установки (в том числе запуск со сменного носителя). В таких случаях распространяйте runtime-библиотеки вместе с приложением, как описано в следующем разделе.

Распространение библиотек вместе с приложением

Чтобы распространять runtime-библиотеки MSVC8 вместе с приложением, нужно скопировать три DLL-файла (msvcp80.dll, msvcr80.dll и mscvcm80.dll) и файл манифеста (Microsoft VC80.CRT.manifest) в каждый каталог с приложением или DLL-файлом (.exe or .dll), который требует Microsoft MSVC8 runtime.

Типичное приложение, использующее с Firebird Embedded, требует наличия этих трех файлов в каталоге приложения и в подкаталогах intl и udf. Чтобы избежать увеличения общего размера приложения (вследствие трехкратного дублирования файлов), в версии 2.1.2 были изменены пути, по которым ищутся файлы runtime-библиотеки (cм. также CORE-2243).

Эти изменения позволяют Firebird Embedded корректно работать, даже если структура каталогов приложения не соответствует правилам распространения runtime-библиотек MSVC8:

  1. Библиотеки ib_util.dll, fbudf.dll, ib_udf.dll, fbintl.dll скомпилированы без встроенного манифеста и не ищут файлы runtime-библиотек в своем каталоге. Для корректной работы с ними нужно, чтобы программа уже загрузила runtime-библиотеки MSVC8 до первого обращения к этим DLL-файлам.

  2. В библиотеку fbembed.dll добавлен код активации и загрузки своего runtime-манифеста до загрузки других необходимых DLL.

Примечания

  1. Настоятельно рекомендуется использование официального дистрибутива Microsoft для установки MSVC8 runtime-библиотек! Установочный файл vcredist_x86.exe или vcredist_x64.exe (в зависимости от выбранного пакета) должен быть в пакетах установки полной и Embedded версий Firebird. Также он доступен по ссылке на сайте Microsoft.

  2. Разрабатываемые UDF-библиотеки должны соблюдать одно из следующих требований, если MSVC8 runtime-библиотеки распространяются отдельно. При компиляции UDF-библиотеки MSVC8 runtime-библиотеки должны либо:

    • вообще НЕ использоваться

    • использоваться, но компилироваться без встроенного манифеста

    • использоваться и компилироваться со встроенным манифестом (вариант по умолчанию в IDE MSVC) - в этом случае runtime-библиотеки должны располагаться в каталоге с UDF-файлом.

Обратная совместимость

Дмитрий Еманов

При миграции баз данных с версии 2.0.x или 2.1.x на версию 2.5 необходимо иметь в виду проблемы с совместимостью, которые могут возникнуть в базах данных и использующих их приложениях. Не рекомендуется начинать миграцию до решениях этих проблем.

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

Чтобы 32-битные утилиты могли работать с 64-битным сервером, были добавлены новые API-функции и структуры (struct perf64 и perf64_xxx) и изменены утилиты isql и qli для поддержки нового API. Это значит, что утилиты isql и qli версии 2.5 несовместимы с более старыми версиями клиентских библиотек.

Более подробное описание приведено в разделе Корректная обработка 64-битных значений в функциях получения статистики.

Проверка метаданных на корректность

Если строковые метаданные базы данных не были предварительно преобразованы в кодировку UTF8, то восстановление (restore) базы данных сервером версии 2.5 выдаст ошибку о некорректных строках в метаданных. Для устранения проблемы нужно использовать файлы в подкаталоге /misc/upgrade/metadata и параметры -fix_fss_data и -fix_fss_metadata утилиты gbak.

Удаленные параметры конфигурации

Устаревшие параметры конфигурации OldParameterOrdering и CreateInternalWindow больше не поддерживаются и удалены из файла firebird.conf. Кроме того, благодаря новой реализации менеджера блокировок два параметра (LockSemCount и LockSignal), использующиеся для его настройки в предыдущих версиях, стали ненужными и также удалены. Параметр MaxFileSystemCache переименован в FileSystemCacheThreshold.

Изменения в языке SQL

Зарезервированные слова

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

Проверка UNICODE-строк на корректность

Строки и текстовые BLOB-ы в кодировке UNICODE_FSS теперь проверяются на корректность.

Обработка операций в предложении SET

Ранее в предложении SET оператора UPDATE новые (измененные) значения полей заменяли старые значения и были доступны для последующего изменения этим же оператором. Если одно поле менялось или использовалось несколько раз, то после первого изменения старое значения терялось, что не соответствует требованиям SQL-стандарта.

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

Но в целях обратной совместимости в файл конфигурации добавлен параметр OldSetClauseSemantics. Этот временный параметр и будет удален в будущих версиях.

Утилиты

fb_lock_print

Поскольку в версии 2.5 базы данных имеют отдельные таблицы блокировок, утилита fb_lock_print теперь требует указывать путь к файлу базы данных с помощью параметра -d <путь>.

Устаревшие функции

В связи ожидаемым с удалением функции isc_ddl в Firebird 3.0, некоторые возможности, существующие в утилитах gdef и gpre, объявляются устаревшими, т.е. они будут работать в версии 2.5, но не будут работать в Firebird 3:

  • gdef больше не будет поддерживаеться. Вместо нее следует использовать утилиту isql с обычными DDL-запросами.

  • В случае использования прекомпилятора gpre замените все DDL-операторы на «EXEC SQL EXECUTE IMMEDIATE "..."»

  • Во всех прикладных программах вызовы isc_ddl должны быть заменены DDL-запросами.

Изменения в API

Отклонение некорректных параметров TPB

API-функции isc_start_transaction() и isc_start_multiple() теперь выдают ошибку, если TPB (блок параметров транзакции) содержит несовместимые параметры.

Например, ненулевое значение параметра «wait timeout» несовместимо с параметром «no wait»; параметр «no record version» совместим только с уровнем изоляции транзакции ReadCommitted и т.д. Теперь вместо самостоятельного выбора правильной комбинации параметров сервер выдаст ошибку о некорректном содержимом TPB.

Более подробное описание приведено в разделе Диагностика транзакций.

Константа SQL_NULL

Добавлена константа SQL_NULL для обработки предиката OR ? IS NULL без вызова исключения «Data type unknown». Более подробное описание приведено в разделе Поддержка нетипизированных параметров в IS NULL.

Усиление безопасности

Отключено автоматическое предоставление прав SYSDBA администраторам Windows

В версии 2.1 учетные записи, состоящие в группе Администраторы, автоматически получали права SYSDBA по умолчанию. В версии 2.5 предоставление прав SYSDBA регулируется для каждой базы данных отдельно с помощью SQL-оператора ALTER ROLE RDB$ADMIN { SET | DROP } AUTO ADMIN MAPPING

Более подробное описание роли RDB$ADMIN читайте в разделе Новая системная роль RDB$ADMIN.

Режим аутентификации по умолчанию (Windows)

В версии 2.1.0 была добавлена возможность аутентификации средствами ОС Windows (Trusted Authentication) и введен конфигурационный параметр Authentication, который по умолчанию имел значение mixed, т.е. по умолчанию была разрешена и аутентификация средствами ОС, и обычная аутентификация с помощью базы данных пользователей Firebird. В версии 2.5 параметр по умолчанию имеет значение native. Чтобы разрешить использование Trusted Authentication необходимо вручную установить значение параметра в mixed или trusted.

Ссылка в трекере: CORE-2376

MacOSX

Для корректной работы сервера в многопоточном режиме необходимо Grand Central Dispatch, который впервые появился в MacOSX 10.6 (Snow Leopard). Таким образом, Firebird 2.5 будет работать только в версии MacOSX 10.6 и выше.

Замечание

Для использования более старых версий MacOSX используйте более старые версии Firebird.

Дистрибутивы для различных платформ

В этой главе описываются существующие дистрибутивы Firebird для редких (неосновных) операционных систем и изменения и усовершенствования в них.

IBM eServer z-Series

Linux/s390 (32-bit)

Дамиан Иванов

Александр Пешков

Ссылка в трекере: CORE-2625

Дистрибутив для платформы Linux/s390 (32-bit) построен на архитектуре s390x. Патч удаляет параметр -DS390X из файла prefix.linux_s390x и заменяет его параметрами __s390__ и __s390x__ , которые поддерживаются компилятором gcc. Это позволяет использовать один префиксный файл для обеих платформ.

Замечание

s390 не имеет ограничений на выравнивание.

Linux/s390x (64-bit)

Дэн Горак

Александр Пешков

Ссылка в трекере: CORE-2559

Дистрибутив для платформы Linux/s390x (64-bit).

Linux/sh4 (Renesas SH)

Нобухиро Ивамацу

Дамиан Иванов

Александр Пешков

Ссылка в трекере: CORE-2655

Дистрибутив для платформы Linux/sh4 (Renesas SH) поддерживает варианты выравнивания little-endian и big-endian.

HP-UX

Таблица блокировок на платформе HP-UX

Александр Пешков

Ссылка в трекере: CORE-2644

Дистрибутивы для всех POSIX-платформ, кроме HP-UX, позволяют таблице блокировок увеличиваться в размерах при нехватке памяти. В HP-UX аппаратные ограничения платформы PA-RISC не позволяют динамически менять размер таблицы, поскольку платформа не поддерживает отображение одного файла на разные виртуальные адреса в одном процессе, поэтому функция ISC_remap_file не работает и таблица блокировок не могла увеличиваться в размерах. Разработчики SAS решили данную проблему в своей редакции СУБД Vulcan и этот патч был импортирован и в дистрибутив Firebird 2.5 для HP-UX.

Поддержка старых платформ Windows 32-bit

Николай Самофатов

Ссылка в трекере: CORE-2609

Поддержка операционных систем Microsoft Windows 98, ME и NT4 в версии Firebird 2.5 не планировалась, однако компания Red Soft, которая осуществляет поддержку систем Win98/ME и NT4 для государственных организаций в России, запросила разрешение для включения соответствующих условий компиляции (выделенных в отдельные файлы), позволяющих скомпилировать дистрибутив Firebird 2.5 для этих старых версий Windows.

Эти дистрибутивы не являются основными для Firebird 2.5!

  • Эти дистрибутивы не проходят QA-тестирование в рамках проекта.

  • Официальные Windows-дистрибутивы Firebird не поддерживают вышеперечисленные старые версии Windows.

  • Любая техническая поддержка, разработка и исправление ошибок в этих дистрибутивах осуществляется не командой проекта Firebird, а теми, кто их использует.

Исправленные ошибки

Ошибки версии Firebird 2.5.0

Ядро сервера и API

CORE-3115 А. Пешков, Д. Коваленко

Ошибки в процедурах сжатия записей.

 

CORE-3103 Д. Еманов

Оператор SELECT выполняет больше неиндексированных чтений в 2.5 RC3, чем в 2.1.3.

 

CORE-3101 А. дос Сантос Фернандес, Д. Еманов

Выполнение оператора ALTER DOMAIN было невозможно в базах данных, мигрированных с более ранних версий.

 

CORE-3100 В. Хорсун

Параметры режима WAIT и таймаута блокировки внешней транзакции, создаваемой оператором EXECUTE STATEMENT, не соответствовали параметрам локальной транзакции.

 

CORE-3096 А. дос Сантос Фернандес

Исправление ошибки CORE-2893 вызвало регрессию при компилировании запросов.

 

CORE-3094 А. дос Сантос Фернандес

При использовании в предикате NOT IN селективной хранимой процедуры не обрабатывались ее входные параметры.

 

CORE-3090 А. дос Сантос Фернандес

Неправильный результат соединения LEFT JOIN таблицы и константного подзапроса.

 

CORE-3089 В. Хорсун

Ошибка при выполнении запросов к внешнему источнику данных InterBase 4.1 (ODS 8) с помощью оператора EXECUTE STATEMENT.

 

CORE-3079 В. Хорсун

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

 

Сбои сервера

CORE-3109 А. дос Сантос Фернандес

При вызове функции isc_dql_exec_immed3_m() с запросом CREATE DATABASE с дескриптором транзакции равным NULL происходил сбой сервера.

 

Утилиты командной строки

gsec

CORE-3116 А. Пешков

Утилита gsec выводила список пользователей в поток stderr вместо of stdout.

 

Ошибки предыдущих версий

Ядро сервера и API

CORE-3034 В. Хорсун

Отмена запроса (например, из-за выключения (shutdown) базы данных или по команде пользователя) во время вставки ключа в индекс по выражению могла привести к ошибке «bugcheck 300 (can't find shared latch)».

 

CORE-3016 В. Хорсун

В некоторых случаях при закрытии соединения с базой данных в файл firebird.log записывалось сообщение об ошибке «Fatal lock manager error: invalid lock id (0), errno: 0».

 

CORE-3015 В. Хорсун

Исправлены ошибки «Cannot initialize the shared memory region».

 

CORE-3003 Д. Еманов

Добавлена проверка на наличие оператора SUSPEND в процедурах, вызываемых с помощью оператора SELECT и если оператор SUSPEND отсутствует, будет выдано сообщение об ошибке «Procedure ... is not selectable (it does not contain a SUSPEND statement)». Но если эта ошибка обнаруживается во время восстановления базы данных из резервной копии, то процесс восстановления теперь не прерывается, а вместо ошибки выводится предупреждение (Warning) с тем же текстом.

 

CORE-2995 В. Хорсун

Дублирование ошибки в статус-векторе в некоторых случаях.

 

CORE-2993 В. Хорсун, Д. Еманов

В высоконагруженных системах при работе с таблицами мониторинга (MON$) могла появляться ошибка «Fatal lock manager: Invalid lock id (NNN)».

 

CORE-2900 А. дос Сантос Фернандес

Запрос, содержащий DISTINCT, может приводить к регулярным, но случайным ошибкам доступа к памяти (access violation).

 

CORE-2977 В. Хорсун

Индексированные поля типа DATE некорректно обра