成为MySQL DBA后,再看ORACLE数据库(九、用户与权限)

数据库的用户和权限的管理是DBA日常运维工作中的重要组成部分,不同数据库的用户权限体系及管理方式也会有差别,本文将对ORACLE的用户权限体系和常用操作进行一个总结。

一、用户管理

ORACLE中创建用户语句和mysql一样,不同的是mysql可以在用户后面加ip以实现ip层面的访问控制。在ORACLE中,创建用户即创建同名schema。记得初学ORACLE时就搞不懂schema的概念,后来理解了其实schema就是指数据库对象的集合,包括表、视图、存储过程等等,在ORACLE中这个集合是集合到用户下,而在MySQL中这个集合是集合到数据库下,所以在MySQL中database即schema。另外在SQLServer和PG中,在实例下的数据库下面还有一层schema的概念,这就和ORACLE、MySQL都不一样,可以说在对数据库对象管理的层次上面又多了一层。在ORACLE中可以通过conn user/password命令切换不同的用户,在删除用户时需要加上cascade:drop user user_name [cascade],这样才可以级联删除该用户下面的数据库对象。

二、系统权限

ORACLE的用户权限可以分为系统权限、对象权限以及角色权限。其中系统权限是指执行特定类型SQL命令的权限,它用于控制用户可以执行的一个或一组数据库操作,常用的系统权限包括create session,create table等,新创建的用户至少要授予create session才可以连接数据库。

系统权限中对数据对象加上any,比如create any table,表示可以在任意用户中进行操作。通过查询视图dba_sys_privs可以获取用户的系统权限,其中select any table权限是指可以访问其他用户所有的表,但是仍然无法查询dba_数据字典视图,这个需要select any dictionary权限。

三、对象权限

对象权限就是指针对数据库对象的权限,比如对表的增删改查权限。在ORACLE中,对象的拥有者拥有对象的所有权限,比如用户创建了一个对象,该用户拥有这个对象的所有权限,并且对象的拥有者可以向外分配权限。通过数据字典视图dba_tab_privs可以查询用户拥有的对象权限。

四、角色权限

角色可以理解为一些权限的集合,角色的作用是用来简化权限的管理。我们可以创建一个角色,再将一些系统权限或对象权限一并赋予给这些创建的角色,再把这个角色赋予给用户,此时该用户就拥有这个角色下的所有权限。在ORACLE中,使用最多的还是两个系统角色,connect和resource。创建应用用户时可以给用户connect和resource角色这样该用户就可以满足大多数业务场景的需要,此外也可以把connect和resource角色授给不同的用户以实现权限管控和隔离。查询系统视图role_sys_privs和role_tab_privs可以分别查询角色拥有的系统权限和对象权限。通过查询dba_role_privs视图可以查询用户拥有哪些角色。

五、总结

除了以上几类用户权限,还有一种权限叫做列权限,即对表的某一列或几列赋权,在对表的精细化权限管理时会用到。由于mysql的用户和schema是分离的,所以mysql的权限管理看上去也更简单,mysql在8.0以后才支持角色权限,但是实际中也很少用到,而ORACLE的两个系统角色帮助管理员简化了用户权限的管理。mysql中可以通过show grants语句很方便查看用户的授权语句,在ORACLE可以通过拼接sql的方式导出用户的授权语句:

#对象权限授权语句
select 'grant '||PRIVILEGE||' on '||OWNER||'.'||TABLE_NAME||' to '||GRANTEE||';' from dba_tab_privs where GRANTEE='APP2';
#系统权限授权语句
select 'grant '||PRIVILEGE||' to '||GRANTEE||';' from dba_sys_privs where GRANTEE='APP2';
#角色授权语句
select 'grant '||GRANTED_ROLE||' to '||GRANTEE||';' from dba_role_privs where GRANTEE='APP2';
posted @ 2024-06-14 22:25  海布里_MySQL  阅读(8)  评论(0编辑  收藏  举报