如何将用户从security2.fdb(Firebird 2.5)迁移(复制)到security3.fdb(Firebird 3.0)
为了将用户账户(名称、密码等)从 Firebird 2.5 的 security2.fdb 复制到 Firebird 的 security3.fdb 中,请将 RDB$USERS(security2.fdb)中的所有记录复制到 PLG$USERS(security3.fdb)。
最简单的方法是在 Firebird 3 下还原 security2.fdb,然后通过嵌入式连接连接到 security3.fdb,并运行下面的 SQL 脚本(将路径从 localhost:D:\fb\data\security2.fdb 修改为还原后的 security2.fdb 的实际路径)。
此脚本将连接到从 2.5 还原的数据库,并将所有用户数据复制到 security3.fdb 中,如果 Firebird 3 配置中启用了旧版授权(Legacy Authorization),您将能够使用与 2.5 相同的凭据连接到数据库。
connect security.db user sysdba;
set term ^;
EXECUTE BLOCK
AS
DECLARE VARIABLE FRST VARCHAR(32);
DECLARE VARIABLE MDDL VARCHAR(32);
DECLARE VARIABLE LST VARCHAR(32);
DECLARE VARIABLE USR VARCHAR(128);
DECLARE VARIABLE PASSWD VARCHAR(64);
DECLARE VARIABLE ATTR VARCHAR(4096);
DECLARE VARIABLE UID INT;
DECLARE VARIABLE GID INT;
DECLARE VARIABLE SQL VARCHAR(4096);
BEGIN
FOR EXECUTE STATEMENT '
SELECT
RDB$USER_NAME,
RDB$PASSWD,
RDB$FIRST_NAME,
RDB$MIDDLE_NAME,
RDB$LAST_NAME,
RDB$UID,
RDB$GID
FROM
RDB$USERS
WHERE RDB$USER_NAME IS NOT NULL
AND UPPER(RDB$USER_NAME) != ''SYSDBA''
'
ON EXTERNAL DATA SOURCE 'localhost:D:\fb\data\security2.fdb'
AS USER 'SYSDBA' password 'masterkey'
INTO :USR,
:PASSWD,
:FRST,
:MDDL,
:LST,
:UID,
:GID
DO
BEGIN
SQL = '
INSERT INTO PLG$USERS(
PLG$USER_NAME,
PLG$PASSWD,
PLG$FIRST_NAME,
PLG$MIDDLE_NAME,
PLG$LAST_NAME,
PLG$UID,
PLG$GID)
VALUES(';
SQL = SQL || '''' || USR || '''';
SQL = SQL || ',''' || PASSWD || '''';
SQL = SQL || ',' || COALESCE('''' || FRST || '''', 'NULL');
SQL = SQL || ',' || COALESCE('''' || MDDL || '''', 'NULL');
SQL = SQL || ',' || COALESCE('''' || LST || '''', 'NULL');
SQL = SQL || ',' || COALESCE(UID, 'NULL');
SQL = SQL || ',' || COALESCE(GID, 'NULL');
SQL = SQL || ')';
EXECUTE STATEMENT SQL;
END
END^
set term ;^
commit;
exit;