如何通过执行REVOKE命令在Oracle数据库中彻底撤销特定用户的DBA权限?
- 内容介绍
- 文章标签
- 相关推荐
本文共计962个文字,预计阅读时间需要4分钟。
相关专题:
必须用具有 dba 权限的用户(如 sys 或 system)执行 revoke dba from user_name;,否则会报 ora-01031: insufficient privileges 错误。
用哪个账号执行 REVOKE DBA 才有效
只有本身拥有 DBA 角色且带 ADMIN OPTION 的用户才能撤销其他用户的 DBA 权限。常见可行账号是 SYS AS SYSDBA 或 SYSTEM(前提是它没被人为移除 ADMIN OPTION)。SYSTEM 用户有时会被限制掉该选项,所以最稳妥的是用 SYS 登录:
sqlplus / as sysdba
登录后直接运行:
REVOKE DBA FROM scott;
注意:scott 必须大写(如果创建时用了双引号小写则另说),且该用户必须当前确实持有 DBA 角色——否则会报 ORA-01952: system privilege not granted to 'SCOTT'。
REVOKE DBA 不能跨实例或跨容器生效
Oracle 多租户(CDB/PDB)环境下,DBA 是一个数据库级角色,不是 CDB 级全局角色。如果你在 CDB$ROOT 中执行 REVOKE DBA FROM scott;,它只影响 CDB 根容器;若 scott 在某个 PDB 中也被授予了 DBA,那 PDB 里的权限不会自动消失。
- 先确认目标用户在哪一层:查
SELECT CON_ID, GRANTEE, GRANTED_ROLE FROM CDB_ROLE_PRIVS WHERE GRANTEE = 'SCOTT' AND GRANTED_ROLE = 'DBA'; - 在对应
CON_ID的容器中切换连接(如ALTER SESSION SET CONTAINER = pdb1;),再执行REVOKE - 不要依赖 PL/SQL Developer 的图形界面“去掉勾选”就以为完成——界面操作可能只作用于当前连接的容器
撤销后用户仍能连库?检查 CREATE SESSION 是否残留
DBA 角色自带 CREATE SESSION,但撤销 DBA 不等于自动收回这个权限。用户可能还单独被授予过 CREATE SESSION,或者属于 CONNECT 角色(旧版默认含 CREATE SESSION)。
执行完 REVOKE DBA FROM scott; 后,建议顺手检查:
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'SCOTT' AND PRIVILEGE = 'CREATE SESSION';
如果结果非空,且你真想禁用登录,得额外执行:
REVOKE CREATE SESSION FROM scott;
否则用户仍可用 scott 账号连入数据库,只是无法执行 DROP USER、ALTER SYSTEM 等高危操作。
图形化工具里点“删掉 DBA 角色”为什么有时不生效
PL/SQL Developer、SQL Developer 等工具的用户编辑界面,本质是拼 SQL 执行,但容易漏掉两个关键点:
- 未显式指定
CONTAINER = CURRENT(尤其在 PDB 中操作时,工具可能默认连 CDB$ROOT) - 界面点击“Apply”后没真正提交事务(有些版本需手动按 Ctrl+Enter 或确认弹窗)
- 更隐蔽的是:某些工具对角色名大小写敏感,界面上显示
dba,但实际元数据存的是DBA,而界面删除逻辑可能匹配失败
遇到界面操作无效,优先切回命令行,用 sqlplus / as sysdba 直接执行语句并查 DBA_ROLE_PRIVS 确认结果。
真正麻烦的不是执行那条 REVOKE,而是搞清用户在哪个容器、是否还有残留系统权限、以及图形工具背后有没有悄悄绕过你的意图。别信界面“已应用”,一定要查视图验证。
本文共计962个文字,预计阅读时间需要4分钟。
相关专题:
必须用具有 dba 权限的用户(如 sys 或 system)执行 revoke dba from user_name;,否则会报 ora-01031: insufficient privileges 错误。
用哪个账号执行 REVOKE DBA 才有效
只有本身拥有 DBA 角色且带 ADMIN OPTION 的用户才能撤销其他用户的 DBA 权限。常见可行账号是 SYS AS SYSDBA 或 SYSTEM(前提是它没被人为移除 ADMIN OPTION)。SYSTEM 用户有时会被限制掉该选项,所以最稳妥的是用 SYS 登录:
sqlplus / as sysdba
登录后直接运行:
REVOKE DBA FROM scott;
注意:scott 必须大写(如果创建时用了双引号小写则另说),且该用户必须当前确实持有 DBA 角色——否则会报 ORA-01952: system privilege not granted to 'SCOTT'。
REVOKE DBA 不能跨实例或跨容器生效
Oracle 多租户(CDB/PDB)环境下,DBA 是一个数据库级角色,不是 CDB 级全局角色。如果你在 CDB$ROOT 中执行 REVOKE DBA FROM scott;,它只影响 CDB 根容器;若 scott 在某个 PDB 中也被授予了 DBA,那 PDB 里的权限不会自动消失。
- 先确认目标用户在哪一层:查
SELECT CON_ID, GRANTEE, GRANTED_ROLE FROM CDB_ROLE_PRIVS WHERE GRANTEE = 'SCOTT' AND GRANTED_ROLE = 'DBA'; - 在对应
CON_ID的容器中切换连接(如ALTER SESSION SET CONTAINER = pdb1;),再执行REVOKE - 不要依赖 PL/SQL Developer 的图形界面“去掉勾选”就以为完成——界面操作可能只作用于当前连接的容器
撤销后用户仍能连库?检查 CREATE SESSION 是否残留
DBA 角色自带 CREATE SESSION,但撤销 DBA 不等于自动收回这个权限。用户可能还单独被授予过 CREATE SESSION,或者属于 CONNECT 角色(旧版默认含 CREATE SESSION)。
执行完 REVOKE DBA FROM scott; 后,建议顺手检查:
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'SCOTT' AND PRIVILEGE = 'CREATE SESSION';
如果结果非空,且你真想禁用登录,得额外执行:
REVOKE CREATE SESSION FROM scott;
否则用户仍可用 scott 账号连入数据库,只是无法执行 DROP USER、ALTER SYSTEM 等高危操作。
图形化工具里点“删掉 DBA 角色”为什么有时不生效
PL/SQL Developer、SQL Developer 等工具的用户编辑界面,本质是拼 SQL 执行,但容易漏掉两个关键点:
- 未显式指定
CONTAINER = CURRENT(尤其在 PDB 中操作时,工具可能默认连 CDB$ROOT) - 界面点击“Apply”后没真正提交事务(有些版本需手动按 Ctrl+Enter 或确认弹窗)
- 更隐蔽的是:某些工具对角色名大小写敏感,界面上显示
dba,但实际元数据存的是DBA,而界面删除逻辑可能匹配失败
遇到界面操作无效,优先切回命令行,用 sqlplus / as sysdba 直接执行语句并查 DBA_ROLE_PRIVS 确认结果。
真正麻烦的不是执行那条 REVOKE,而是搞清用户在哪个容器、是否还有残留系统权限、以及图形工具背后有没有悄悄绕过你的意图。别信界面“已应用”,一定要查视图验证。

