从 FB3.0 连接到 FB2.5

Connect from FB3.0 to FB2.5

我有 2 台使用 Firebird 2.5 的服务器。每台服务器都有一个单独的数据库,其中一台连接到另一台以检索一些数据。其中一台服务器切换到 Firebird 3.0,现在无法连接到 2.5 服务器。它说我的用户名或密码不正确。我已使用凭据连接到 2.5 服务器,它们没问题。

为了检索数据,我以用户 [USER] 密码 [PASSWORD] 在外部数据源 [SERVER] 上使用执行语句 [STATEMENT]。

2.5的数据库比较多,升级到3.0比较麻烦

有人遇到过这个问题吗?

我使用以下简单语句在具有不同端口的同一服务器上使用 Firebird 2.5 (2.5.8) 和 Firebird 3 (3.0.4) 进行了一些测试(并根据我的情况修改了一些部分)测试)看看我能产生什么样的连接失败。

set term #;
execute block returns (tblname char(31))
as
begin
  for execute statement 'select rdb$relation_name from rdb$relations where coalesce(rdb$system_flag, 0) = 0' 
    on external data source 'localhost/3051:D:\data\db\testdatabase.fdb' 
      as user 'sysdba' password 'masterkey'
    into tblname
  do suspend;
end#
set term ;#

Firebird 3 到 Firebird 2.5

使用此语句,在以下情况下,我可以从 Firebird 3 到 2.5 得到错误 "Your user name and password are not defined."

  1. Firebird 3 的 AuthClient1 配置不包含 Legacy_Auth。 Firebird 3 无法向 Firebird 2.5 进行身份验证,因为 Firebird 2.5 只知道遗留身份验证机制。

    要解决此问题,请将 Legacy_Auth 添加到 Firebird 3 服务器 firebird.conf 中的 AuthClient 设置(例如将其设置为 AuthClient = Srp, Legacy_Auth)并重新启动服务器.

    这点很可能是你的问题。

  2. 未指定用户名和密码(即在 execute statement 中留下 as user 'sysdba' password 'masterkey')。这可能是由于身份验证机制的差异,因为 Firebird 不知道 SRP 协议的实际密码,因此将无法向其他服务器进行身份验证。

    指定用户名和密码可以解决此问题。

Firebird 2.5 到 Firebird 3

反方向(Firebird 2.5 到 3),以下情况无法建立连接:

  1. 使用仅作为 Srp 用户存在的用户名和密码进行身份验证。这会导致错误 "Your user name and password are not defined.",因为 Firebird 2.5 仅支持旧版身份验证,因此只能与 Firebird 3 中 Legacy_UserManager 插件存在的用户进行身份验证.

    为 Legacy_UserManager 插件创建一个用户(同名或不同名):

    create user theuser password 'thepassword' using plugin Legacy_UserManager;
    commit;
    

    如果这导致错误"Missing requested management plugin",那么您需要编辑Firebird 3 firebird.conf并将Legacy_UserManager添加到UserManager 设置(例如设置为 UserManager = Srp, Legacy_UserManager;默认仅为 Srp)并重新启动 Firebird。

    作为 SYSDBA,您可以通过执行

    检查 Firebird 3 服务器上存在哪个插件(或多个插件!)用户存在
    select SEC$USER_NAME, SEC$PLUGIN 
    from SEC$USERS
    
  2. Firebird 3 具有设置 WireCrypt = Required(这是默认值!)。这会产生错误 "connection rejected by remote interface".

    要解决此问题,请在 Firebird 3 服务器的 firebird.conf 中设置 WireCrypt = Enabled 并重新启动服务器。

  3. 未指定用户名和密码(即在 execute statement 中留下 as user 'sysdba' password 'masterkey')。这会产生错误 "unknown ISC error 335545106"(如果使用 Firebird 3 消息文件,实际消息是 "Error occurred during login, please check server firebird.log for details"),其中日志Firebird 3 的表示 "No matching plugins on server",这可能是由于身份验证机制的差异。

    指定用户名和密码可以解决此问题。

  4. Firebird 3 的 AuthServer 配置不包含 Legacy_Auth(默认仅 Srp!)。这也会产生错误 "unknown ISC error 335545106"(如果使用 Firebird 3 消息文件,实际消息是 "Error occurred during login, please check server firebird.log for details"),其中日志火鸟 3 说 "No matching plugins on server".

    要解决此问题,请将 Legacy_Auth 添加到 Firebird 3 服务器 firebird.conf 中的 AuthServer 设置(例如将其设置为 AuthServer = Srp, Legacy_Auth)并重新启动服务器.

当然,双向错误"Your user name and password are not defined."也可以通过使用不存在的用户或错误的密码产生。


1. 设置 AuthClient 在这里是相关的,因为服务器在执行 execute statement ... on external data source ... 时充当客户端