为什么Firebird 2.5.8在SELECT CURRENT_ROLE上不返回NONE?

时间:2019-08-15 18:54:48

标签: firebird firebird2.5 flamerobin

根据我的问题在这里 How to REVOKE ROLE GRANTED BY another user on Firebird 2.5.8?

和@Arioch的有用建议,用于在命令之前查询实际连接了什么ROLE。

SELECT CURRENT_ROLE FROM RDB$DATABASE

现在,尽管我的连接字符串明确使用“ ROLE = RDB $ ADMIN”,但在gsec中检查给定用户具有admin选项,当我运行命令时结果为NONE。这是使用Firebird ADO.NET FirebirdSql.Data.FirebirdClient接口v6.6。

因此,我使用FlameRobin进行了类似的检查,并使用相同的用户和指定的RDB $ ADMIN ROLE登录,结果是相同的:

enter image description here

有什么主意我为什么做错了为什么不返回“ RDB $ ADMIN”?

1 个答案:

答案 0 :(得分:3)

由于在特定数据库中授予了用户权限,因此该用户在该特定数据库中必须为RDB $ ADMIN,并且必须指定connect上的角色。用户在GSEC中具有管理员角色仅意味着该用户在安全性数据库中具有管理员角色。这并不意味着他们在特定数据库中具有管理员角色。

事实CURRENT_ROLE返回NONE意味着用户未指定角色,或者未在当前数据库中被授予RDB $ ADMIN角色。

引用Firebird Language Reference, User Authentication, RDB$ADMIN Role

  

内部创建的角色RDB $ ADMIN存在于每个数据库中。   将RDB $ ADMIN角色分配给数据库中的常规用户将授予   该用户仅在当前数据库中拥有SYSDBA的特权。

     

提升的特权在用户登录后生效   RDB $ ADMIN角色下的常规数据库,并完全控制   数据库中的所有对象。

     

在安全性数据库中被授予RDB $ ADMIN角色后,   创建,编辑和删除用户帐户的权限。

  

要通过SQL管理用户帐户,受赠方必须指定   连接时具有RDB $ ADMIN角色。没有用户可以连接到安全性   数据库,因此解决方案是用户连接到常规数据库   他还拥有RDB $ ADMIN权限的数据库,提供RDB $ ADMIN   他的登录参数中的角色。从那里,他可以提交任何SQL用户   管理命令。

     

该用户所在的任何数据库的SQL路由均被阻止   没有被授予RDB $ ADMIN角色。

GRANT ADMIN ROLE子句仅适用于安全性数据库(特别适用于CREATE/ALTER/DROP USER SQL用户管理语句),并且仅当用户通过普通数据库连接时,该数据库也具有RDB $ ADMIN角色在连接上指定该角色。

要在特定数据库中授予用户管理员特权,需要使用以下方式在该特定数据库中授予该角色:

GRANT [ROLE] RDB$ADMIN TO username

他们需要指定connect上的角色。