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这类系统级权限
排查步骤
- 检查用户直接持有的表权限:
SELECT privilege, owner, table_name FROM user_tab_privs WHERE table_name = 'ATTENDANCE' AND privilege = 'UPDATE';
若返回结果无列名限制,说明用户直接拥有全表UPDATE权限。
- 检查角色
updatename的权限:
SELECT privilege, column_name FROM role_tab_privs WHERE role = 'UPDATENAME' AND table_name = 'ATTENDANCE' AND privilege = 'UPDATE';
若返回结果中column_name为NULL,说明角色拥有全表UPDATE权限。
- 检查用户的系统权限:
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
相关产品推荐
相关产品推荐

