
Oracle数据库用户管理与权限配置完全指南:从创建到授权的详细教程
在Oracle数据库的日常运维中,用户管理和权限配置是每一位DBA必须熟练掌握的基础技能。合理的权限分配不仅关系到数据库的安全性,也直接影响业务的正常运行。本文将系统梳理Oracle数据库的用户管理流程、权限体系以及相关数据字典的使用方法,帮助你从零开始掌握这套权限管理机制。
一、查询当前登录用户信息
在实际工作中,我们经常需要确认当前数据库会话的身份。Oracle提供了多种方式来实现这一目的。
查看当前会话用户
最简单的方式是执行以下SQL语句:
SELECT USER FROM DUAL;这条语句会返回当前会话的用户名。
使用系统上下文函数
另一种更灵活的方法是使用SYS_CONTEXT函数:
SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') FROM DUAL;这种方法可以获取更多关于会话环境的信息,而不仅仅是用户名。
快捷命令
在一些客户端工具中,还可以直接使用命令:
SHOW USER需要注意的是,如果要查看数据库中所有正在登录的用户会话,必须拥有DBA权限。这时可以查询V$SESSION动态性能视图:
SELECT USERNAME FROM V$SESSION;二、查看其他用户的对象
在Oracle数据库中,不同用户之间的对象访问受到严格限制。
DBA用户的权限
拥有DBA角色的用户(如SYS、SYSTEM)可以直接访问数据库中任何用户的表。例如,DBA用户想要查看test用户下的student表,可以直接执行:
SELECT * FROM test.student;普通用户的限制
对于普通用户来说,默认情况下无法访问其他用户模式下的对象。如果需要跨用户访问,必须由对象的所有者进行显式授权,这一点将在后面的对象权限部分详细介绍。
三、创建与激活普通用户的完整流程
创建一个新用户并使其能够正常开展工作,通常需要经过以下几个步骤。
第一步:创建用户
使用CREATE USER语句创建用户。以下命令创建了一个名为test、密码也为test的用户:
CREATE USER test IDENTIFIED BY test;此时,该用户虽然已经存在于数据库中,但尚未获得任何权限,甚至连登录数据库的能力都没有。
第二步:授予登录权限
为了让用户能够连接数据库,需要授予CREATE SESSION系统权限:
GRANT CREATE SESSION TO test;完成这一步后,test用户就可以成功登录数据库了,但仍然无法创建任何数据库对象。
第三步:授予资源权限
如果希望用户能够创建表等对象,还需要进一步授权。
首先,授予建表权限:
GRANT CREATE TABLE TO test;其次,用户需要在表空间上拥有存储数据的配额。有两种方式可以实现:
方式一:授予无限制使用表空间的权限
GRANT UNLIMITED TABLESPACE TO test;方式二:分配具体的配额大小
ALTER USER test QUOTA 100M ON users;完成以上授权后,test用户就可以创建自己的表了,并且自动拥有对自己所创建表的增、删、改、查完整权限。
第四步:查询用户拥有的权限
用户可以通过查询数据字典视图来查看自己拥有的系统权限:
SELECT * FROM USER_SYS_PRIVS;这个视图会列出当前用户拥有的所有系统权限。
第五步:撤销权限
如果需要收回之前授予的权限,可以使用REVOKE命令:
REVOKE CREATE TABLE FROM test;四、常用数据字典视图说明
Oracle提供了一系列数据字典视图,用于查询数据库中的对象和权限信息。这些视图的前缀决定了它们的可见范围,理解它们的区别非常重要。
三种视图前缀的含义
DBA_*:包含数据库中所有对象的信息,只有DBA用户可以访问。ALL_*:包含当前用户有权访问的所有对象的信息,包括自己拥有的和他人授权给自己的。USER_*:仅包含当前用户自己所拥有的对象的信息。
实际应用示例
查询当前用户拥有的表(注意对象名默认是大写的):
SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TABLES WHERE TABLE_NAME = 'STUDENT';DBA用户如果想要查看test用户下的表,可以查询DBA_TABLES视图:
SELECT OWNER, TABLE_NAME, TABLESPACE_NAME FROM DBA_TABLES WHERE OWNER = 'TEST';五、对象权限与跨用户访问
默认情况下,每个用户只能访问自己模式下的对象。如果用户test想要访问用户test1创建的mytab表,就必须由test1进行授权。
授予对象访问权限
test1用户执行以下命令,将mytab表的查询权限授予test用户:
GRANT SELECT ON mytab TO test;授权完成后,test用户可以通过模式名前缀来访问这张表:
SELECT * FROM test1.mytab;授予所有对象权限
如果希望一次性授予所有可用的对象权限,可以使用:
GRANT ALL ON mytab TO test;撤销对象权限
撤销对象权限同样使用REVOKE命令:
REVOKE SELECT ON mytab FROM test;或者:
REVOKE ALL ON mytab FROM test;查看对象权限
用户可以通过USER_TAB_PRIVS视图查看自己已经被授予的对象权限:
SELECT * FROM USER_TAB_PRIVS;列级权限控制
Oracle的对象权限可以精细控制到列级别。需要注意的是,SELECT和DELETE权限无法仅针对特定列授予,但UPDATE和INSERT权限可以。
授权更新特定列:
GRANT UPDATE(name) ON mytab TO test;授权插入特定列:
GRANT INSERT(id) ON mytab TO test;列级授权的信息可以查询USER_COL_PRIVS视图。
六、权限的传递机制
Oracle允许权限的接收者将权限继续传递给其他用户,但系统权限和对象权限的传递方式有所不同。
系统权限的传递
系统权限的传递使用WITH ADMIN OPTION选项。例如,DBA执行以下命令:
GRANT ALTER TABLE TO A WITH ADMIN OPTION;那么用户A就获得了将该权限继续授予其他用户的能力,A可以执行:
GRANT ALTER TABLE TO B;对象权限的传递
对象权限的传递使用WITH GRANT OPTION选项。例如,test1执行:
GRANT SELECT ON mytab TO A WITH GRANT OPTION;那么用户A就可以将test1.mytab表的查询权限继续授予其他用户:
GRANT SELECT ON test1.mytab TO B;七、配置Enterprise Manager管理员
Oracle Enterprise Manager是企业级的数据库管理工具,创建一个能够登录EM的管理员用户需要特定的权限配置。
创建基础EM访问用户
以下命令创建用户testem,并授予其登录EM所需的最低必要权限:
CREATE USER testem IDENTIFIED BY testem;
GRANT CREATE SESSION, SELECT ANY DICTIONARY TO testem;
GRANT MGMT_USER TO testem;完成上述操作后,testem用户可以登录EM,但此时它只是一个普通用户,并不具备管理员的全部功能。
提升为EM超级管理员
如果需要将testem用户提升为EM管理员,需要通过EM的图形界面进行操作。具体路径为:登录EM后,进入"管理"菜单,选择"管理员",在管理员列表中找到testem用户,将其角色设置为"有权访问所有目标的超级管理员权限"。
总结
Oracle数据库的权限管理体系可以分为两个层面:系统权限和对象权限。
- 系统权限(如CREATE SESSION、CREATE TABLE)通常由DBA用户(如SYS)进行授予和回收。
- 对象权限(如表、视图的SELECT权限)由对象的拥有者进行授予和回收。
- 权限可以通过
WITH ADMIN OPTION(系统权限)或WITH GRANT OPTION(对象权限)实现向下传递。 - 合理使用
USER_、ALL_、DBA_系列视图,可以帮助我们高效地查询权限和对象信息。
掌握这些基础知识,你就能够在Oracle数据库中游刃有余地进行用户管理和权限配置了。