当前位置:首页 > 问答 > 正文

Oracle里改用户权限那些事儿,怎么一步步弄明白才靠谱

要弄明白Oracle里改用户权限这事儿,不能一上来就死记硬背命令,那样很容易搞乱,甚至出安全事故,咱们得一步步来,像剥洋葱一样,从外到里把逻辑理清楚,这事儿的关键不在于你会敲哪条命令,而在于你心里有没有一张清晰的“地图”。

第一步:先别急着动手,搞清楚“谁”对“什么”有“哪种”权限

这是最基础也是最容易出错的地方,很多人一听说要改权限,立马就想找GRANT命令,但其实你首先得搞清楚现状,这里有个非常实用的工具,就是Oracle自带的数据字典视图,你不用记那些复杂的视图名,只要知道核心思路:去查一些名字里带USER_ALL_DBA_的“虚拟表”。

你想知道当前你自己这个用户都有哪些权限,可以查USER_SYS_PRIVS(系统权限)和USER_TAB_PRIVS(对象权限),但更常见的是,你需要知道别的用户或者所有用户的权限情况,这时候就需要有更高权限的账号(比如SYSTEM或SYS)去查DBA_开头的视图。DBA_USERS看所有用户,DBA_SYS_PRIVS看系统权限分配,DBA_TAB_PRIVS看对象权限分配。(来源:Oracle官方文档关于数据字典视图的说明)

这一步的目的就是做“审计”,做到心中有数,别等到你把权限收回了,才发现某个关键应用因为没了权限而瘫痪了。

第二步:分清“系统权限”和“对象权限”这两大类

这是Oracle权限体系的核心,必须分清楚,你可以把它们想象成小区门禁和自家房门的钥匙。

  • 系统权限:是进入小区大门的资格,或者是在小区里能干某类事情的资格,比如CREATE SESSION权限,就是进入Oracle这个“小区”的门禁卡,没这个权限你连数据库都登不上去,再比如CREATE TABLE权限,是允许你在你自己的“地盘”(也就是你的用户模式Schema)里建房子的资格。SELECT ANY TABLE就更厉害了,相当于小区物业 master key,能查看小区里任何一户(任何用户的表)的情况,这类权限通常很大,授予时要极其小心。(来源:Oracle官方文档对系统权限的定义)

  • 对象权限:是你进了小区之后,访问特定某户人家(某个用户的某个表、视图等)的权限,比如用户A有一张员工表EMP,他可以把这张表的SELECT(查询)权限授予用户B,这样用户B就能查A的EMP表了,也可以单独授予INSERT(插入)、UPDATE(更新)、DELETE(删除)权限,或者组合授予,这就是对象权限,它针对的是某个具体的“东西”。(来源:Oracle官方文档对对象权限的定义)

很多时候权限混乱,就是因为把这两者搞混了,有人想让你能查询另一张表,结果他顺手给了你一个SELECT ANY TABLE的系统权限,这相当于为了开一扇门,给了你整个小区的万能钥匙,安全隐患极大。

Oracle里改用户权限那些事儿,怎么一步步弄明白才靠谱

第三步:掌握授权(GRANT)和收权(REVOKE)的基本语法

搞清楚了现状和权限分类,现在可以动手了,命令本身不难。

  • 授权GRANTGRANT 权限名称 TO 用户名;

    • 授予系统权限:GRANT CREATE TABLE TO 小张; (允许小张在自己模式下建表)
    • 授予对象权限:GRANT SELECT ON 员工表 TO 小李; (允许小李查询我的“员工表”)
    • 如果想允许被授权的人还能把这个权限再转授给别人,可以加上WITH ADMIN OPTION(针对系统权限)或WITH GRANT OPTION(针对对象权限),但这要非常谨慎,相当于你给了他发门禁卡的权力,容易导致权限失控。
  • 收权REVOKEREVOKE 权限名称 FROM 用户名;

    • 收回系统权限:REVOKE CREATE TABLE FROM 小张;
    • 收回对象权限:REVOKE SELECT ON 员工表 FROM 小李;

这里有个非常重要的细节要注意:收回对象权限时,是级联失效的,用户A把表T的SELECT权限给了B,B又用WITH GRANT OPTION给了C,如果A收回了B的权限,那么C的权限也会自动消失,但系统权限的收回不是级联的,如果A给B带了WITH ADMIN OPTION的系统权限,B又给了C,那么A收回B的权限时,C的权限依然存在。(来源:Oracle官方文档对REVOKE语句行为的描述)这个区别非常重要,是排查权限问题时的一个关键点。

第四步:理解“角色”这个好帮手——批量管理权限

Oracle里改用户权限那些事儿,怎么一步步弄明白才靠谱

如果用户一多,权限一复杂,一个个地去给用户授权会累死人,这时候就要用到“角色”了,角色就是个权限的打包袋。

你可以创建一个角色,比如叫报表查询员,然后把查询多个重要业务表的SELECT权限都授予这个角色,你只需要执行一句GRANT 报表查询员 TO 用户X,用户Y,用户Z;,这三个用户就一次性拥有了所有查询权限,管理起来非常方便,要修改权限时,也只需要修改角色拥有的权限,所有被授予这个角色的用户都会自动生效。(来源:Oracle官方文档对角色的介绍)

Oracle本身也预定义了一些常用角色,比如CONNECT(基本的连接权限)、RESOURCE(创建表、序列等资源的权限)和强大的DBA角色,但要小心,不要随意使用DBA角色。

第五步:实践和排查问题的思路

理论懂了,就要在测试环境多练习,给自己设定一些小任务,创建一个新用户,让他只能查询SCOTT用户的DEPT表,并且能把自己模式下的表授权给别人”。

当遇到权限问题时,别慌,按照这个思路排查:

  1. 确认问题:用户具体是做什么操作时报错?错误代码是什么?(比如ORA-01031: 权限不足)
  2. 检查权限来源:是缺少系统权限还是对象权限?用第一步说的数据字典视图去查。
  3. 检查角色:用户被授予了哪些角色?这些角色是否被默认设置了?(可以用SELECT * FROM SESSION_ROLES;查看当前会话生效的角色)有时候权限是通过角色授予的,但角色没有设为默认生效,导致权限看似有实则无。
  4. 顺藤摸瓜:如果权限是通过角色获得的,就去查这个角色到底包含了哪些权限。

弄明白Oracle改权限,核心是建立清晰的逻辑层次:查现状 -> 分类型 -> 用命令 -> 巧用角色 -> 勤实践,死记硬背命令是最不靠谱的,理解了背后的“为什么”,你才能在任何情况下都心里有底,操作起来才靠谱。