DB2权限管理-组(group) 和角色(role)的区别

来源:互联网 发布:美工需要具备什么条件 编辑:程序博客网 时间:2024/05/29 03:07

       DB2权限管理中组和角色的管理的确让很多人(不管是菜鸟还是老鸟)感到困惑。 相对而言,oracle就好多了,根本就没有组的概念,只有角色。 而在DB2和Oralce的概念映射里,DB2的组实际上也被影射为Oracle的角色。 这说明原来组和角色原来是差不多的东西啊!

       其实,从实际应用角度而言,的确是那么回事,组和角色在很多时候是可以互换的。虽然定义有所不一样。

       组(group)  - 一组用户的集合,就是LUW(linux/unix/Windows)中操作系统所管理的组,组的创建,修改,维护都是在数据库之外的OS级别进行的。

       角色(role)    - 一组权限的集合,是数据库级别进行创建,修改和维护的。

 

       从定义上看,还是完全不同的东西嘛。但是如果仔细一想,其实他们解决的是相同的问题。就是为了方便权限的管理,批量的赋予用户权限。下面我们就举一个具体例子来说明三种情况下的权限管理。

        权限需求: 某个数据库中有HR的两张表TAB1和TAB2,HR部门有两个数据库用户,分别是HR_USR1和HR_USR2,  这两个用户需要对这两张表有SELECT权限。

                            同时此数据库中Finance部门有两张表TAB3和TAB4,Finance部门有两个用户,分别是FN_USR1和FN_USR2,  这两个用户需要对这两张表有SELECT权限。

表名用户权限 HR.TAB1HR_USR1SELECT HR.TAB2HR_USR1SELECT FN.TAB3FN_USR1SELECT FN.TAB4FN_USR1SELECT HR.TAB1HR_USR2SELECT HR.TAB2HR_USR2SELECT HR.TAB3FN_USR2SELECT HR.TAB4FN_USR2SELECT 


第一种: 即不使用组也不是用角色,具体赋权SQL如下:

grant SELECT on HR.TAB1 to user HR_USR1;grant SELECT on HR.TAB2 to user HR_USR1;grant SELECT on FN.TAB3 to user FN_USR1;grant SELECT on HR.TAB4 to user FN_USR1;grant SELECT on HR.TAB1 to user HR_USR2;grant SELECT on HR.TAB2 to user HR_USR2;grant SELECT on FN.TAB3 to user FN_USR2;grant SELECT on HR.TAB4 to user FN_USR2;


第二种:只使用组,具体步骤如下(假设操作系统是Linux):

    1. 在操作系统上创建两个组HR_GRP, FN_GRP

groupadd HR_GRPgroupadd FN_GRP

    2. 在操作系统上将已经存在的用户HR_USR1,HR_USR2加入HR_GRP,  将FN_USR1,FN_USR2加入FN_GRP
usermod -G HR_GRP HR_USR1usermod -G HR_GRP HR_USR2usermod -G FN_GRP FN_USR1usermod -G FN_GRP FN_USR2

    3.具体赋权SQL如下:

grant SELECT on HR.TAB1 to group HR_GRP;grant SELECT on HR.TAB2 to user HR_GRP;grant SELECT on FN.TAB3 to user FN_GRP;grant SELECT on FN.TAB4 to user FN_GRP;


第三种:只使用角色,具体赋权SQL如下:

--创建角色

create role HR_ROLE;create role FN_ROLE:


--定义角色权限
grant SELECT on HR.TAB1 to role HR_ROLE;grant SELECT on HR.TAB2 to user HR_ROLE;grant SELECT on FN.TAB3 to user FN_ROLE;grant SELECT on FN.TAB4 to user FN_ROLE;

--将角色赋予用户

grant role HR_ROLE to user HR_USR!,HR_USR2;grant role FN_ROLE to user FN_USR1,FN_USR2;

是不是条条大路通罗马? 上面三种方式都能完成任务。但是孰优孰劣呢? 毫无疑问,没有人会喜欢第一种,当用户数量(m)和表的数量(n)都很多的时候,赋权语句的复杂度是O(mxn), 第二种和第三种的复杂度是O(m). 那么第二种和第三种哪种好呢?这个仁者见仁,智者见智, 我自己倾向于第三种(使用角色)。理由如下:

  • 使用Role的方式,不需要在操作系统层面进行用户组的管理,全部是在数据库级别的管理。减少了DBA和操作系统管理员之间沟通成本。(虽然我知道很多DBA直接就是数据库服务器上的Linux/Unix系统管理员)
  • 在创建视图,物化视图,存储过程,用户自定义函数,触发器以及Package中的静态SQL,赋予组的权限不起作用。
  • 角色可以有层次关系,就是说可以把一个角色赋给另外一个角色。(grant role ROLE1 to role ROLE2)
  • 因为ORACLE使用ROLE,方便以后移植。


  我给的理由充分吧?不管如何,作为一个DB2使用的老鸟,我也逐步开始抛弃Group,使用Role了。


0 0