You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 12c授予特定列更新权限失效问题

问题解决:Oracle 12c中授予列级UPDATE权限后仍能修改其他列

问题场景

在Oracle 12c sqlplus中执行以下授权语句,提示成功,但持有updatename角色的用户仍能修改attendance表的其他列:

SQL> grant select,update(name) on attendance to updatename;

Grant succeeded.

核心原因

Oracle的权限是累加生效的,只要用户通过任何途径(直接授权、角色、系统权限)获得了该表的全表UPDATE权限,就会覆盖列级的权限限制。常见触发场景:

  • 用户直接被授予了attendance表的全表UPDATE权限
  • updatename角色此前已被授予该表的全表UPDATE权限
  • 用户拥有UPDATE ANY TABLE这类系统级权限

排查步骤

  1. 检查用户直接持有的表权限:
SELECT privilege, owner, table_name 
FROM user_tab_privs 
WHERE table_name = 'ATTENDANCE' 
  AND privilege = 'UPDATE';

若返回结果无列名限制,说明用户直接拥有全表UPDATE权限。

  1. 检查角色updatename的权限:
SELECT privilege, column_name 
FROM role_tab_privs 
WHERE role = 'UPDATENAME' 
  AND table_name = 'ATTENDANCE' 
  AND privilege = 'UPDATE';

若返回结果中column_name为NULL,说明角色拥有全表UPDATE权限。

  1. 检查用户的系统权限:
SELECT privilege 
FROM user_sys_privs 
WHERE privilege IN ('UPDATE ANY TABLE', 'ALL PRIVILEGES');

若返回上述权限,说明用户有系统级全表更新权限。

解决办法

根据排查结果对应处理:

  • 回收用户直接的全表UPDATE权限:
REVOKE UPDATE ON attendance FROM [你的用户名];
  • 回收角色的全表UPDATE权限:
REVOKE UPDATE ON attendance FROM updatename;

(执行后仅保留之前授予的UPDATE(name)列级权限)

  • 回收系统级权限(按需):
REVOKE UPDATE ANY TABLE FROM [你的用户名];

内容的提问来源于stack exchange,提问作者w_m02

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:52:05