我正在使用Firebird 2.5.8(ODS版本11.2),并通过Firebird ADO.NET v6.6(在使用Visual Studio的C#中)进行连接。我已经建立了一个数据库管理工具来配置我们的表,以及执行一些基本的Firebird用户管理操作。该数据库具有不同的角色(MyRoleX和MyRoleY),用于授予/限制访问权限。
用户管理操作包括将这些角色授予/撤消给不同的用户。登录该工具后,连接使用RDB $ ADMIN ROLE,并且已使用ADMIN ROLE创建了连接的用户。最后,该工具可能有多个Firebird用户(例如Mgr1和Mgr2)。
好的,因此Mgr1可以创建一个新用户,以及:
GRANT MyRoleX TO UserA;
GRANT MyRoleY TO UserA;
然后,Mgr1不在班次/空缺/不可用,Mgr2意识到不应向UserA授予MyRoleY。但是当Mgr2登录并尝试运行命令时:
REVOKE MyRoleY FROM UserA;
给出错误信息:
unsuccessful metadata update
Mgr2 is not grantor of Role on MyRoleY to UserA.
并且如果命令更改为:
REVOKE MyRoleY FROM UserA GRANTED BY Mgr1;
然后显示错误消息:
unsuccessful metadata update
Only SYSDBA or database owner can use GRANTED BY clause.
虽然第二条消息明确可见,但为什么如果同时使用ROLE = RDB $ ADMIN(当然,这些用户被授予ADMIN ROLE)连接了Mgr1和Mgr2,那么他们可以不执行此操作吗?
在Statements for Revoking Privileges 的标题为“ 撤销授予的特权”下的状态为:
当前用户必须以完全管理权限登录
如果以RDB $ ADMIN身份登录,那不是完全的管理员特权吗?
在链接'RDB$ADMIN Role'下的顶部,它还指出:
将RDB $ ADMIN角色分配给数据库中的常规用户将授予该用户SYSDBA的特权。
那么为什么Mgr2拥有像SYSDBA这样的特权?
一些寻求答案的问题:
我在这里做错什么了吗?有没有办法连接或允许Mgr2将GRANT撤销到Mgr1制作的角色?
我们不想共享SYSDBA或数据库所有者凭据来执行这些操作,所以还有其他解决方案吗?
答案 0 :(得分:2)
由于Firebird 2.5.9发行说明未提及任何与用户授权相关的错误修正,因此我认为您有误解,很可能是您在使用Mgr2登录时未调用<DialogContentText>
{result1}
</DialogContentText>
。在尝试撤消操作之前,请尝试查询活动角色。
只需使用 IBExpert 套件在 Firebird 2.5.9 Win64 中进行了尝试。
第一次会议:
RDB$ADMIN
第二届会议:
/*** connected as SYSDBA with no role specified ***/
GRANT RDB$ADMIN TO ADM_1;
GRANT RDB$ADMIN TO ADM_2;
CREATE ROLE USER_ROLE;
第三次会议:
/***** ADM_1 with RDB$ADMIN role specified *****/
select current_role, current_user from rdb$database;
-- ROLE USER
-- RDB$ADMIN ADM_1
grant user_role to user_1;
grant user_role to user_2 granted by sysdba;
因此,至少在2.5.9 SuperServer中,它具有到数据库的单个连接-它可以正常工作。
P.S。由于您可以拥有的管理员人数不止两个,而且有几个管理员可以向用户授予角色,因此必须逐一找到并撤消其中的每个授予,所以我建议您针对这种情况,用户,然后以他的名字授予所有资助,就像我在第二届会议中对/***** ADM_2 with RDB$ADMIN role specified *****/
select current_role, current_user from rdb$database;
-- ROLE USER
-- RDB$ADMIN ADM_2
revoke user_role from user_2 granted by sysdba;
-- OK
revoke user_role from user_1;
-- This operation is not defined for system tables.
-- unsuccessful metadata update.
-- ADM_2 is not grantor of Role on USER_ROLE to USER_1.
revoke user_role from user_1 granted by adm_1;
-- OK
所做的那样。