使用FirebirdSql.Data.FirebirdClient连接非SYSDBA用户报错排查
先帮你梳理下可能的原因,毕竟你已经排除了密码错误,而且FlameRobin能正常连接,问题大概率出在角色配置、驱动和服务器的验证交互上:
1. 角色未正确授予给用户
Firebird的角色不会自动关联用户,必须显式执行授权语句。你需要确认是否已经给TEST用户授予了READ_ONLY_OTN角色:
GRANT READ_ONLY_OTN TO TEST;
另外还要注意角色名称的大小写:如果创建角色时用了双引号(比如CREATE ROLE "READ_ONLY_OTN";),那代码里的Role参数也必须用双引号包裹,否则Firebird会把它当成小写的角色名去查找,自然找不到。
2. Firebird 3.0身份验证协议不兼容
Firebird 3.0默认使用Srp身份验证,但有些工具(比如FlameRobin)可能默认用了旧的Legacy_Auth协议连接,而你的ADO.NET驱动在指定角色时,验证流程可能触发了协议不兼容的问题。
你可以尝试在连接字符串里显式指定验证方式:
builder.Authentication = "Srp"; // 或者换成"Legacy_Auth"试试
同时检查Firebird服务器的firebird.conf配置文件,确保AuthServer参数包含你使用的验证方式,比如:
AuthServer = Srp, Legacy_Auth
3. 先验证用户本身能否无角色连接
先去掉builder.Role = "READ_ONLY_OTN";这行代码,用TEST用户直接连接数据库。如果这时候能成功,说明问题确实出在角色相关的配置上;如果还是报错,那可能是TEST用户缺少CONNECT权限(虽然FlameRobin能连,但可以再确认下是否执行过GRANT CONNECT TO TEST;)。
4. 驱动版本的兼容性细节
虽然7.5.0版本的驱动理论上支持Firebird 3.0,但可能存在一些小的兼容性bug。你可以尝试升级驱动到最新的稳定版(比如目前的9.x系列),或者降级到7.0.x版本,看看是否能解决角色验证的问题。
内容的提问来源于stack exchange,提问作者dsungaro

