Список несовместимостей на уровне языка SQL
Проблемы совместимости языка SQL возможны как для объектов самой базы данных (PSQL процедуры и функции), так и в DSQL запросах, используемых в вашем приложении.
Для обнаружения проблем совместимости языка SQL для объектов базы данных рекомендуется следующий способ. Выполните извлечение метаданных базы данных в скрипт на старой версии Firebird.
isql <database> -x -o create_script.sql
Раскоментируйте внутри скрипта оператор CREATE DATABASE
, внесите в него необходимые правки, и попробуйте создать новую базу данных из скрипта в Firebird 5.0:
isql -i create_script.sql -o error.log -m
где, ключ -i
– входной файл скрипта; ключ -o
– выходной файл сообщений; ключ -m
заставляет isql
выводить сообщения об ошибках в выходной файл сообщений.
Далее смотрим файл error.log
на наличие ошибок, и в случае их обнаружения, меняем метаданные в исходной БД. Повторяем описанный выше алгоритм до тех пор, пока все ошибки не будут устранены. После чего можно спокойно делать backup/restore.
Далее перечислим некоторые наиболее часто встречающиеся проблемы совместимости на уровне SQL, которые вы можете исправить ещё до перехода на новую ODS. Полный список несовместимостей вы можете прочитать в Release Notes 5.0 в главе "Compatibility Issues". При миграции с 3.0 необходимо также ознакомится с одноимённой главой в Release Notes 4.0, а при миграции с 2.5 — Release Notes 3.0.
Новые зарезервированные слова
Проверьте вашу базу данных на наличие новых зарезервированных слов в идентификаторах, столбцах и переменных. В первом SQL диалекте такие слова не могут применяться в принципе (надо будет переименовать), в третьем — могут применяться, но должны обрамляться двойными кавычками.
Список новых ключевых и зарезервированных слов вы можете найти в Release Notes 3.0 и 4.0 в главе "Reserved Words and Changes". Ключевые слова могут применяться в качестве идентификаторов, хотя это не рекомендуется.
Начиная с Firebird 5.0 вы можете посмотреть полный список ключевых и зарезервированных слов с помощью запроса:
SELECT
RDB$KEYWORD_NAME,
RDB$KEYWORD_RESERVED
FROM RDB$KEYWORDS
Этот запрос можно выполнить на любой БД с ODS 13.1, например на employee.db
, входящей в поставку Firebird 5.0.
Столбец RDB$KEYWORD_NAME
содержит само ключевое слово, а RDB$KEYWORD_RESERVED
- флаг является ли ключевое слово зарезервированным.
Имена столбцов в PSQL курсорах
Актуально: при миграции с Firebird 2.5.
Все выходные столбцы в PSQL курсорах объявленных как DECLARE CURSOR
должны иметь явное имя или псевдоним. То же самое касается PSQL курсоров используемых как FOR SELECT … AS CURSOR <cursor name> DO …
.
create procedure sp_test
returns (n int)
as
declare c cursor for (select 1 /* as a */ from rdb$database);
begin
open c;
fetch c into n;
close c;
suspend;
end
Statement failed, SQLSTATE = 42000 unsuccessful metadata update -ALTER PROCEDURE SP_TEST failed -Dynamic SQL Error -SQL error code = -104 -Invalid command -no column name specified for column number 1 in derived table C
Новые типы данных
Актуально: при миграции с Firebird версий 2.5, 3.0.
В Firebird 4.0 введены новые типы данных:
-
TIMESTAMP WITH TIME ZONE
-
TIME WITH TIME ZONE
-
INT128
-
NUMERIC(38, x)
иDECIMAL(38, x)
-
DECFLOAT(16)
иDECFLOAT(34)
Последние два типа не вызывают особых проблем, поскольку раньше вы их не использовали, и обычно выражения их не возвращают.
Некоторые выражения теперь могу возвращать типы NUMERIC(38, x)
, DECIMAL(38, x)
и INT128
. О решении этой проблемы мы поговорим позже, поскольку на этапе изменения ODS они обычно не проявляются.
Выражения CURRENT_TIMESTAMP
и CURRENT_TIME
теперь возвращают типы TIMESTAMP WITH TIME ZONE
и TIME WITH TIME ZONE
.
Для старых клиентских библиотек и приложений вы можете установить режим совместимости типов, однако это не поможет внутри хранимых процедур, функций и триггеров. Вам необходимо использовать выражения LOCALTIMESTAMP
и LOCALTIME
вместо CURRENT_TIMESTAMP
и CURRENT_TIME
там где вы не хотите получить типы данных с часовыми поясами. Данные выражения специально были введены в корректирующих релизах Firebird 2.5.9 и Firebird 3.0.4, чтобы вы заранее могли подготовить свои базы данных для миграции на Firebird 4.0 и выше.
При присваивании переменной (столбца) типа TIMESTAMP
значения выражения CURRENT_TIMESTAMP
будет произведено преобразование типа, то есть неявный CAST(CURRENT_TIMESTAMP AS TIMESTAMP)
, поэтому даже без замены CURRENT_TIMESTAMP
и CURRENT_TIME
на LOCALTIMESTAMP
и LOCALTIME
всё будет продолжать работать, но производительность в некоторых случаях может упасть. Например:
create global temporary table gtt_test (
id integer not null,
t timestamp default current_timestamp
) on commit preserve rows;
alter table gtt_test add constraint pk_gtt_test primary key (id);
Здесь поле t
имеет тип TIMESTAMP
, а CURRENT_TIMESTAMP
возвращает TIMESTAMP WITH TIME ZONE
из-за чего производительность INSERT
в такую таблицу снижается.
Note
|
Этот случай подробно описан в баг трекере, тикет 7854. Первоначально падение производительности составляло 30%, что довольно существенно, но после ряда оптимизаций оверхед удалось снизить до 3-5%.Если вы не хотите лишних затрат, то лучше использовать |
Литералы дат и времени
Актуально: при миграции с Firebird версий 2.5, 3.0.
В Firebird 4.0 ужесточён синтаксис литералов дат и времени.
Литералы 'NOW', 'TODAY', 'TOMORROW', 'YESTERDAY' с префиксами TIMESTAMP, DATE, TIME теперь запрещены.Дело в том, что значение таких литералов вычислялось во время подготовки DSQL запроса или компиляции PSQL модулей, что приводило к неожиданным результатам.
Если что-то вроде TIMESTAMP 'NOW' использовалось в запросах DSQL в коде приложения или в перенесенном PSQL, возникнет проблема совместимости с Firebird 4 и выше.
.. DECLARE VARIABLE moment TIMESTAMP; .. SELECT TIMESTAMP 'NOW' FROM RDB$DATABASE INTO :moment; /* здесь переменная: moment будет "заморожена" как отметка времени в момент последней компиляции процедуры или функции */ ..
Необходимо вычистить такие литералы, например заменить их на явное преобразование CAST('NOW' AS TIMESTAMP)
, в коде ваших процедур и функций до преобразования вашей базы данных в новую ODS.
Кроме того, необходимо проверить другие литералы дат и времени с явным заданием известной даты (времени). Ранее в таких литералах позволялись разделители частей даты и времени не соответствующие стандарту. Теперь такие разделители запрещены. Подробнее о разрешённых форматах литералов даты и времени вы можете прочитать в "Руководство по языку SQL СУБД Firebird 5.0" в главе "Литералы даты и времени".
INSERT … RETURNING требует привилегию SELECT
Актуально: при миграции с Firebird версий 2.5, 3.0.
Начиная с Firebird 4.0, если какой-либо оператор INSERT
содержит предложение RETURNING
, которое ссылается на столбцы базовой таблицы, то вызывающей стороне должна быть предоставлена соответствующая привилегия SELECT
.
Эффект стабильности курсора
Актуально: при миграции с Firebird 2.5.
В Firebird 3.0 было сделано важное улучшение, которое называется "стабильность курсоров". В следствии этого улучшения некоторые запросы могут работать по-другому. Этопрежде всего касается запросов, которые изменяют таблицу и читают её в том же курсоре. Стабильность курсора позволяет устранить множество ошибок, присутствующих в предыдущих версиях Firebird, самой известной из которых, является бесконечный цикл в запросе:
INSERT INTO some_table
SELECT * FROM some_table
Маловероятно, что ваши приложения содержат именно такие запросы, тем не менее стабильность курсора может проявляться не совсем в очевидных случаях:
-
некий DML триггер модифицирует таблицу, а затем в том же триггере происходит чтение этой таблицы через оператор
SELECT
. Если данные были модифицированы не в текущем контексте выполнения триггера, то вы можете не увидеть изменения вSELECT
запросе; -
селективная хранимая процедура
SP_SOME
изменяет записи в некоторой таблицыSOME_TABLE
, а затем вы выполняете JOIN с той же таблицей:FOR SELECT ... FROM SP_SOME(...) S JOIN SOME_TABLE ...
Если в вашем коде присутствуют подобные случаи, то рекомендуем переписать данные части с учётом эффекта "стабильности курсора".
Поддержка внешних функций (UDF) объявлена устаревшей
Поддержка внешних функций (UDF) начиная с Firebird 4 объявлена устаревшей.
Эффект от этого заключается в том, что UDF нельзя использовать с конфигурацией по умолчанию, поскольку для параметра UdfAccess
в firebird.conf
значение по умолчанию теперь None
. Библиотеки UDF ib_udf
и fbudf
изъяты из дистрибутива.
Большинство функций в этих библиотеках уже устарели в предыдущих версиях Firebird и были заменены встроенными аналогами. Теперь доступны безопасные замены для некоторых из оставшихся функций либо в новой библиотеке определяемых пользователем подпрограмм (UDR) с именем [lib]udf_compat.[dll/so/dylib]
(это делается после смены ODS), либо в виде преобразований по сценарию в сохраненные функции PSQL.
Рекомендуем заранее (до перехода на новую ODS) заменить UDF функции на их встроенные аналоги. Если вы делаете миграцию с Firebird 3.0, вы также можете переписать часть функций на PSQL.
Если после этих шагов у вас остались UDF функции, то необходимо изменить параметр конфигурации
UdfAccess = Restrict UDF
Преобразование базы данных к новой ODS
После предварительной подготовки, вы можете попробовать преобразовать базу данных к новой ODS с помощью инструмента gbak.
Note
|
Рекомендовать всегда начинать с backup/resore метаданных: old_version\gbak -b -g -m old_db stdout | new_version\gbak -c -m stdin new_db Иначе можно получить ошибку метаданных после того, как будет записан весь терабайт данных, что будет очень обидно. Кроме того, навосстановленных в новой версии метаданных удобно проверять работу скриптов перекомпиляции объектов базы. |
В данном примере предполагается, что на одной машине стоят Firebird 3.0 и Firebird 5.0. Firebird 3.0 работает используя TCP порт 3053, а Firebird 5.0 — 3055.
Прежде всего необходимо создать резервную копию вашей базы данных на текущей версии Firebird с помощью следующей команды.
gbak -b -g -V -user <username> -pas <password> -se <service> <database> <backup_file> -Y <log_file>
gbak -b -g -V -user SYSDBA -pas 8kej712 -se server/3053:service_mgr my_db d:\fb30_backup\my_db.fbk -Y d:\fb30_backup\backup.log
Далее необходимо восстановить вашу копию на Firebird 5.0.
gbak -c -v -user <username> -pas <password> -se <service> <backup_file> <database_file> -Y <log_file>
Начиная с Firebird 5.0 утилита gbak
может создавать резервную копию и восстанавливать базу данных используя параллелизм. Количество параллельных потоков, используемых при backup или restore, указывается с помощью опции -parallel
или сокращённо -par
. Использвание параллельных потоков может ускорить процесс восстановления в 2-3 раза, в зависимости от вашего аппартного обеспечения и базы данных.
По умолчанию, паралелизм отключен в Firebird 5.0. Для того, чтобы была возможность его использовать необходимо установить параметр MaxParallelWorkers
в firebird.conf
.Этот параметр ограничивает максимальное количество паралеллельных потоков, которое может быть использовано ядром Firebird или его утилитами. По умолчанию он равен 1.Рекомендуется установить MaxParallelWorkers
в значение равное максимальному количеству физических или логических ядер вашего процессора (или процессоров).
Теперь для восстановления вы можете использовать следующую команду.
gbak -c -par <N> -v -user <username> -pas <password> -se <service> <backup_file> <database_file> -Y <log_file>
Здесь N - количество паралельных потоков которое будет использовать gbak
, оно должно быть меньшим или равным значению установленном в MaxParallelWorkers
.
gbak -c -par 8 -v -user SYSDBA -pas 8kej712 -se server/3055:service_mgr d:\fb30_backup\my_db.fbk d:\fb50_data\my_db.fdb -Y d:\fb50_data\restore.log
Important
|
Важно
Обратите внимание, на переключатели -V и -Y, они обязательно должны использоваться, чтобы вы могли просмотреть в лог файле, что в процессе восстановления пошло не так. |
После восстановления внимательно изучите restore.log
на предмет ошибок. Однако, в этом логе не будет ошибок несовместимости уровня SQL, поскольку объектыБД при restore не перекомпилируются. Если какая-то процедура или триггер содержат несовместимые конструкции, то впоследствии при ALTER
такого объекта будет выдана ошибка.
Полностью очистить БД от таких ошибок можно только если извлечь скрипт из БД операцией
isql -x <database> > script.sql
в предыдущей версии Firebird, и создать пустую БД в Firebird 5.0 из этого скрипта, исправляя возникающие ошибки создания метаданных по очереди.
Предупреждения об отсутствии UDF
После восстановления в файле restore.log
вы можете увидеть следующие предупреждения
gbak: WARNING:function UDF_FRAC is not defined gbak: WARNING: module name or entrypoint could not be found
Это означает, что у вас есть UDF, которые объявлены в базе данных, но их библиотека отсутствует. Выше уже было описано, что надо делать в этом случае. Но это в основном касалось ваших UDF библиотек. Однако если вы использовали UDF из комплекта, поставляемого с Firebird, а именно ib_udf и fbudf, то вы можете заменить их на встроенные функции или на безопасные аналоги UDR расположенные в библиотеке udf_compat.dll
. Для этого необходимо запустить SQL скрипт миграции, поставляемый в комплекте с Firebird 5.0, который расположен в misc/upgrade/v4.0/udf_replace.sql
. Это делается следующей командой
isql -user sysdba -pas masterkey -i udf_replace.sql {your-database}
Этот сценарий не повлияет на объявления UDF из сторонних библиотек!
Быстрое обновление ODS при миграции с Firebird 4.0
Если вы производите миграцию с Firebird 4.0, то существует более быстрый способ обновления ODS, чем backup/restore.
Традиционным способом обновления ODS (On-Disk Structure) является выполнение backup на старой версии Firebird и restore на новой. Это довольно длительный процесс, особенно на больших базах данных.
Однако, в случае обновления минорной версии ODS (номер после точки) backup/restore является избыточным (необходимо лишь добавить недостающие системные таблицы и поля, а также некоторые пакеты). Примером такого обновления является обновление ODS 13.0 (Firebird 4.0) до ODS 13.1 (Firebird 5.0), поскольку мажорная версия ODS 13 осталось той же.
Начиная с Firebird 5.0 появилась возможность обновления минорной версии ODS без длительный операция backup и restore. Для этого используется утилита gfix
с переключателем -upgrade
.
Ключевые моменты:
-
Обновление необходимо производить вручную с помощью команды
gfix -upgrade
-
Требуется монопольный доступ к базе данных, в противном случае выдается ошибка.
-
Требуется системная привилегия
USE_GFIX_UTILITY
. -
Обновление является транзакционным, все изменения отменяются в случае возникновения ошибки.
-
После обновления Firebird 4.0 больше не может открывать базу данных.
Note
|
|
Таким образом, для быстрого обновления ODS вам необходимо проделать следующие шаги:
-
Сделать резервную копию базы данных, например с помощью
nbackup -b 0
, чтобы иметь точку восстановления, если что-то пойдет не так. -
Выполнить команду:
gfix -upgrade <dbname> -user <username> -pass <password>
Данный способ обновления ODS в отличие от backup/restore, занимает секунды (речь о gfix -upgrade
), а не минуты или часы.
Перенос псевдонимов баз данных
Этот раздел актуален для тех кто мигрирует с Firebird 2.5.
Файл aliases.conf
в котором настраивались псевдонимы баз данных переименован в databases.conf
. Он полностью обратно совместим по синтаксису, однако его назначение значительно расширено. Теперь в нём можно задавать некоторые индивидуальные параметры для каждой базы данных. Настоятельно рекомендуем воспользоваться этой возможностью, если ваш сервер обслуживает более одной базы данных.
Параметры, которые можно задавать на уровне базы данных, помечены в файле firebird.conf
надписью 'Per-database configurable'.
Перенос списка пользователей
Перенос списка пользователей из Firebird версий 2.5, 3.0 и 4.0 осуществляется по-разному.
Перенос списка пользователей из Firebird 4.0
Самым простым будет перенос списка пользователей из Firebird 4.0.
Чтобы перенести базу данных безопасности с Firebird 4.0 на 5.0, создайте резервную копию файла security4.fdb
с помощью gbak
Firebird 4.0 и восстановите его как security5.fdb
с помощью gbak
Firebird 5.0. Используйте gbak
локально (используя встроенное соединение), пока Firebird Server не запущен.
Note
|
Копирование файла |
Перенос списка пользователей из Firebird 3.0
Чтобы перенести пользователей из базы безопасности Firebird 3.0 в базу данных безопасности Firebird 4.0 необходимо выполнить резервную копию security3.fdb
с помощью gbak и восстановите его как security5.fdb
с помощью gbak
Firebird 5.0.
Однако учтите, что в этом случае вы потеряете некоторые новые возможности. Мы пойдём более сложным способом:
-
Сделайте резервную копию базы данных безопасности на Firebird 3.0
c:\Firebird\3.0>gbak -b -g -user SYSDBA security.db d:\fb30_backup\security.fbk
-
Восстановите резервную копию на Firebird 5.0 под новым именем
c:\Firebird\5.0>gbak -с -user SYSDBA -pas 8kej712 -se localhost/3054:service_mgr d:\fb30_backup\security.fbk d:\fb50_data\security_30.fdb
-
Сохраните следующий скрипт для переноса пользователей в файл
copy_user.sql
set term ^; EXECUTE BLOCK AS -- замените на параметры вашей копии БД безопасности DECLARE SRC_SEC_DB VARCHAR(255) = 'd:\fb50_data\security_30.fdb'; DECLARE SRC_SEC_USER VARCHAR(63) = 'SYSDBA'; --------------------------------------------------- DECLARE PLG$USER_NAME SEC$USER_NAME; DECLARE PLG$VERIFIER VARCHAR(128) CHARACTER SET OCTETS; DECLARE PLG$SALT VARCHAR(32) CHARACTER SET OCTETS; DECLARE PLG$COMMENT BLOB SUB_TYPE TEXT CHARACTER SET UTF8; DECLARE PLG$FIRST SEC$NAME_PART; DECLARE PLG$MIDDLE SEC$NAME_PART; DECLARE PLG$LAST SEC$NAME_PART; DECLARE PLG$ATTRIBUTES BLOB SUB_TYPE TEXT CHARACTER SET UTF8; DECLARE PLG$ACTIVE BOOLEAN; DECLARE PLG$GROUP_NAME SEC$USER_NAME; DECLARE PLG$UID PLG$ID; DECLARE PLG$GID PLG$ID; DECLARE PLG$PASSWD PLG$PASSWD; BEGIN -- перемещаем пользователей из плагина SRP FOR EXECUTE STATEMENT Q'! SELECT PLG$USER_NAME, PLG$VERIFIER, PLG$SALT, PLG$COMMENT, PLG$FIRST, PLG$MIDDLE, PLG$LAST, PLG$ATTRIBUTES, PLG$ACTIVE FROM PLG$SRP WHERE PLG$USER_NAME <> 'SYSDBA' !' ON EXTERNAL :SRC_SEC_DB AS USER :SRC_SEC_USER INTO :PLG$USER_NAME, :PLG$VERIFIER, :PLG$SALT, :PLG$COMMENT, :PLG$FIRST, :PLG$MIDDLE, :PLG$LAST, :PLG$ATTRIBUTES, :PLG$ACTIVE DO BEGIN INSERT INTO PLG$SRP ( PLG$USER_NAME, PLG$VERIFIER, PLG$SALT, PLG$COMMENT, PLG$FIRST, PLG$MIDDLE, PLG$LAST, PLG$ATTRIBUTES, PLG$ACTIVE) VALUES ( :PLG$USER_NAME, :PLG$VERIFIER, :PLG$SALT, :PLG$COMMENT, :PLG$FIRST, :PLG$MIDDLE, :PLG$LAST, :PLG$ATTRIBUTES, :PLG$ACTIVE); END -- перемещаем пользователей из плагина Legacy_UserManager FOR EXECUTE STATEMENT Q'! SELECT PLG$USER_NAME, PLG$GROUP_NAME, PLG$UID, PLG$GID, PLG$PASSWD, PLG$COMMENT, PLG$FIRST_NAME, PLG$MIDDLE_NAME, PLG$LAST_NAME FROM PLG$USERS WHERE PLG$USER_NAME <> 'SYSDBA' !' ON EXTERNAL :SRC_SEC_DB AS USER :SRC_SEC_USER INTO :PLG$USER_NAME, :PLG$GROUP_NAME, :PLG$UID, :PLG$GID, :PLG$PASSWD, :PLG$COMMENT, :PLG$FIRST, :PLG$MIDDLE, :PLG$LAST DO BEGIN INSERT INTO PLG$USERS ( PLG$USER_NAME, PLG$GROUP_NAME, PLG$UID, PLG$GID, PLG$PASSWD, PLG$COMMENT, PLG$FIRST_NAME, PLG$MIDDLE_NAME, PLG$LAST_NAME) VALUES ( :PLG$USER_NAME, :PLG$GROUP_NAME, :PLG$UID, :PLG$GID, :PLG$PASSWD, :PLG$COMMENT, :PLG$FIRST, :PLG$MIDDLE, :PLG$LAST); END END^ set term ;^ commit; exit;
ImportantВажноНе забудьте заменить значение переменной
SRC_SEC_DB
на путь к копии вашей БД безопасности.NoteЗамечаниеМы исключили копию пользователя SYSDBA, поскольку инициализировали его при установке.
-
Выполните скрипт на Firebird 5.0 подключившись к БД безопасности в embedded режиме
c:\Firebird\5.0>isql -i "d:\fb50_data\copy_users.sql" -u SYSDBA -ch UTF8 security.db
Поздравляем! Ваши пользователи перенесены с сохранением всех атрибутов и паролей.
Перенос списка пользователей из Firebird 2.5
Перенос пользователей из Firebird 2.5 более сложен.В Firebird 3.0 ввели новый способ аутентификации SRP - Secure Remote Password Protocol.Старый способ аутентификации также доступен, но выключен по умолчанию поскольку считается недостаточно безопасным.В Release Notes 3.0 описан способ переноса пользователей из Legacy_UserManager в SRP, однако в этом случае вы не сможете подключаться через fbclient версии 2.5. Кроме того, перенести пароли из Legacy_UserManager в SRP невозможно.Предлагаемый скрипт перенесёт список пользователей, но будут сгенерированы случайные пароли.Если вы хотите восстановить прежние пароли, то это придётся делать вручную.Я написал альтернативный скрипт, который позволяет перенести пользователей из security2.fdb
в security5.fdb
в плагин Legacy_UserManager.Здесь я опишу оба варианта.
Копирование списка пользователей в плагин SRP
Из-за новой модели аутентификации в Firebird 3 обновление базы данных безопасности версии 2.5 (security2.fdb) напрямую для использования в Firebird 5 невозможно.Однако существует процедура обновления, позволяющая сохранить данные учетной записи пользователя — имя пользователя, имя и другие аттрибуты, но не пароли — из базы данных security2.fdb, которая использовалась на серверах версии 2.x.
Процедура требует запуска сценария security_database.sql
, который находится в каталоге misc/upgrade
вашей установки Firebird 3. Эти инструкции предполагают, что у вас есть временная копия этого сценария в том же каталоге, что и исполняемый файл isql.
Note
|
Замечание
|
-
Сделайте резервную копию БД безопасности
security2.fdb
на Firebird 2.5c:\Firebird\2.5>bin\gbak -b -g -user SYSDBA -password masterkey -se service_mgr c:\Firebird\2.5\security2.fdb d: \fb25_backup\security2.fbk
-
Разверните резервную копию на Firebird 5.0
c:\Firebird\5.0>gbak -c -user SYSDBA -password masterkey -se localhost/3054:service_mgr d:\fbdata\5.0\security2.fbk d:\f bdata\5.0\security2db.fdb -v
-
На сервере Firebird 5.0 перейдите в каталог, в котором находится утилита isql, и запустите сценарий обновления:
isql -user sysdba -pas masterkey -i security_database.sql {host/path}security2db.fdb
security2db.fdb
- это просто пример имени базы данных: это может быть любое предпочтительное имя. -
Процедура генерирует новые случайные пароли и затем выводит их на экран.Скопируйте вывод и уведомите пользователей об их новых паролях.
Копирование списка пользователей в плагин Legacy_UserManager
В отличие от предыдущего варианта, данный скрипт сохранит ваши исходные пароли.Однако, мы советуем вам в будущем всё равно перейти на плагин Srp.
-
Сделайте резервную копию БД безопасности
security2.fdb
на Firebird 2.5c:\Firebird\2.5>bin\gbak -b -g -user SYSDBA -password masterkey -se service_mgr c:\Firebird\2.5\security2.fdb d: \fb25_backup\security2.fbk
-
Разверните резервную копию на Firebird 5.0
c:\Firebird\5.0>gbak -c -user SYSDBA -password masterkey -se localhost/3054:service_mgr d:\fbdata\5.0\security2.fbk d:\f bdata\5.0\security2db.fdb -v
-
Сохраните следующий скрипт для переноса пользователей в файл
copy_security2.sql
set term ^; EXECUTE BLOCK AS -- замените на параметры вашей копии БД безопасности DECLARE SRC_SEC_DB VARCHAR(255) = 'd:\fbdata\5.0\security2.fdb'; DECLARE SRC_SEC_USER VARCHAR(63) = 'SYSDBA'; --------------------------------------------------- DECLARE PLG$USER_NAME SEC$USER_NAME; DECLARE PLG$COMMENT BLOB SUB_TYPE TEXT CHARACTER SET UTF8; DECLARE PLG$FIRST SEC$NAME_PART; DECLARE PLG$MIDDLE SEC$NAME_PART; DECLARE PLG$LAST SEC$NAME_PART; DECLARE PLG$GROUP_NAME SEC$USER_NAME; DECLARE PLG$UID INT; DECLARE PLG$GID INT; DECLARE PLG$PASSWD VARBINARY(64); BEGIN FOR EXECUTE STATEMENT q'! SELECT RDB$USER_NAME, RDB$GROUP_NAME, RDB$UID, RDB$GID, RDB$PASSWD, RDB$COMMENT, RDB$FIRST_NAME, RDB$MIDDLE_NAME, RDB$LAST_NAME FROM RDB$USERS WHERE RDB$USER_NAME <> 'SYSDBA' !' ON EXTERNAL :SRC_SEC_DB AS USER :SRC_SEC_USER INTO :PLG$USER_NAME, :PLG$GROUP_NAME, :PLG$UID, :PLG$GID, :PLG$PASSWD, :PLG$COMMENT, :PLG$FIRST, :PLG$MIDDLE, :PLG$LAST DO BEGIN INSERT INTO PLG$USERS ( PLG$USER_NAME, PLG$GROUP_NAME, PLG$UID, PLG$GID, PLG$PASSWD, PLG$COMMENT, PLG$FIRST_NAME, PLG$MIDDLE_NAME, PLG$LAST_NAME) VALUES ( :PLG$USER_NAME, :PLG$GROUP_NAME, :PLG$UID, :PLG$GID, :PLG$PASSWD, :PLG$COMMENT, :PLG$FIRST, :PLG$MIDDLE, :PLG$LAST); END END^ set term ;^ commit; exit;
ImportantВажноНе забудьте заменить значение переменной
SRC_SEC_DB
на путь к копии вашей БД безопасности.NoteЗамечаниеМы исключили копию пользователя SYSDBA, поскольку инициализировали его при установке.
-
Выполните скрипт на Firebird 5.0 подключившись к БД безопасности в embedded режиме
c:\Firebird\5.0>isql -i "d:\fb40_data\copy_security2.sql" -u SYSDBA -ch UTF8 security.db
Поздравляем! Ваши пользователи перенесены с сохранением всех атрибутов и паролей.
Настройка доверительной аутентификации
Настройка доверительной аутентификации (trusted authentification) в Firebird 5.0 делается точно так же как она делалась в Firebird 3.0 или 4.0.Для тех производит миграцию с Firebird 2.5 опишем этот процесс подробнее.
-
Первым делом необходимо подключить плагин доверительной аутентификации в файле конфигурации
firebird.conf
илиdatabases.conf
в параметре AuthServer (по умолчанию он отключен).Для этого необходимо добавить плагин с именем Win_Sspi, и будем использовать его совместно с Srp256.AuthServer = Srp256, Win_Sspi
-
Следующим шагом необходимо включить отображение пользователей из Win_Sspi на
CURRENT_USER
.Для этого необходимо создать отображение в целевой базе данных с помощью следующего запросаCREATE MAPPING TRUSTED_AUTH USING PLUGIN WIN_SSPI FROM ANY USER TO USER;
Данный SQL запрос создаёт отображение только на уровне текущей базе данных.Отображение не будет применяться к другим базам данных расположенных на том же сервере.Если вы хотите создать общее отображение для всех баз данных, то добавьте ключевое слово GLOBAL.
CREATE GLOBAL MAPPING TRUSTED_AUTH USING PLUGIN WIN_SSPI FROM ANY USER TO USER;
-
Включение SYSDBA-подобного доступа для администраторов Windows (если он нужен).
Для включения такого доступа необходимо создать следующее отображение
CREATE MAPPING WIN_ADMINS USING PLUGIN WIN_SSPI FROM Predefined_Group DOMAIN_ANY_RID_ADMINS TO ROLE RDB$ADMIN;
Вместо включения SYSDBA-подобного доступа для всех администраторов Windows, вы можете дать административные привилегии конкретному пользователю с помощью следующего отображения
create global mapping cto_sysdba using plugin win_sspi from user "STATION9\DEVELOPER" to user SYSDBA;
Несовместимости на уровне приложения
На уровне API клиентская библиотека fbclient 5.0 совместима с предыдущими версиями.Однако могут возникнуть проблемы совместимости на уровне некоторых SQL запросов.Большинство из них мы уже описывали ранее в разделеСписок несовместимостей на уровне языка SQL.Далее опишем некоторые другие проблемы, которые могут возникнуть в приложении.