问题不在于 Firebird 记住了默认密码,问题在于 Firebird 为每个身份验证插件存储了一个密码,而 SYSDBA 恰好存在两个(或可能更多)身份验证插件。
要解决此问题,您必须删除其中一个身份验证插件的 SYSDBA 帐户,或更改其密码。不幸的是,对于 Legacy_Auth 插件,删除 SYSDBA 帐户相当困难(您需要从安全数据库中手动将其删除,请参阅此答案的末尾)。
假设标准 Firebird 安装(具有身份验证插件 Srp 和 Legacy_Auth),您需要执行以下操作来更改密码(注意:我假设有问题的帐户是 Legacy_Auth 的帐户,而不是 Srp):
-
在firebird.conf 中,设置UserManager 确保列出两个用户管理员:
UserManager = Srp, Legacy_UserManager
-
重启火鸟
-
更改两个插件的密码
alter user SYSDBA password '<new password>' using plugin Srp;
alter user SYSDBA password '<new password>' using plugin Legacy_UserManager;
请记住:旧版身份验证插件会将密码截断为 8 个字符。
如果您想完全阻止使用 Legacy_Auth 插件进行身份验证,请编辑 firebird.conf 并从 AuthServer 设置中删除 Legacy_Auth(如果数据库具有自定义配置,还要检查 databases.conf)。
我在 firebird-devel 邮件列表中询问了一个关于无法删除 Legacy_Auth SYSDBA 帐户的问题。我得到的答案是,从历史上看,在旧版 Firebird 中无法删除 SYSDBA 帐户,因此 Legacy_UserManager 插件明确禁止删除 SYSDBA(而 Srp 允许删除)。解决方法是直接连接安全数据库,从PLG$USERS表中手动删除用户(其中包含Legacy_Auth用户,Srp用户在PLG$SRP):
delete from plg$users where plg$user_name = 'SYSDBA';
您可以使用isql -user sysdba -password <yourpassword> security.db 连接到安全数据库(假设security.db 别名在databases.conf 中定义,否则使用security3.fdb 的完整路径)。
一个稍微模糊的替代方法是定义一个映射,使用 Legacy_Auth 将身份验证作为 SYSDBA 映射到不同的(非特权)用户(例如 GUEST):
create global mapping NO_LEGACY_SYSDBA
using plugin Legacy_Auth
from user sysdba to user guest;
要删除 Srp 插件的 SYSDBA 帐户,您只需执行(以管理员身份):
drop user SYSDBA using plugin Srp;