收回CONNECT角色不能阻止建表,因其仅含CREATE SESSION权限;真正需收回的是RESOURCE角色、UNLIMITED TABLESPACE权限及显式对象权限,三者缺一不可。

直接收回 CONNECT 角色不能阻止用户建表,因为 CONNECT 本身不带建表权限;真正要收的是 RESOURCE 角色或其隐含的 UNLIMITED TABLESPACE 和对象创建权。
为什么收回 CONNECT 对建表没用
CONNECT 角色只包含 CREATE SESSION 权限,仅允许登录。用户能建表,是因为你同时授了 RESOURCE(或 DBA),而 RESOURCE 自动附带:CREATE TABLE、CREATE SEQUENCE 等对象权限,以及关键的 UNLIMITED TABLESPACE 系统权限。
常见错误现象:执行了 REVOKE CONNECT FROM user_a,结果 user_a 还是能建表——因为 RESOURCE 没动,且会话未断开。
-
CONNECT和RESOURCE是两个独立角色,可单独授予或收回 - 查用户实际拥有的系统权限,用:
SELECT * FROM dba_sys_privs WHERE grantee = 'USER_A' - 查是否通过角色间接获得建表权,用:
SELECT * FROM dba_role_privs WHERE grantee = 'USER_A'
真正要收的三项权限
安全回收建表能力,必须同步处理以下三者,缺一不可:
- 收回
RESOURCE角色:REVOKE RESOURCE FROM user_a - 收回隐式授予的
UNLIMITED TABLESPACE:REVOKE UNLIMITED TABLESPACE FROM user_a(注意:即使没显式授过,只要RESOURCE在身,这条就生效) - 检查并收回可能残留的对象权限,如:
REVOKE CREATE TABLE FROM user_a(虽然RESOURCE收回后通常自动失效,但某些自定义角色或直授场景下需手动清理)
特别注意:UNLIMITED TABLESPACE 收回后,用户在所有表空间配额归零,建表立刻报 ORA-01536: space quota exceeded for tablespace 'USERS'——这是预期行为,不是失败。
回收后用户还能连库吗
能连,前提是仍保留 CREATE SESSION 权限。但如果你连 CONNECT 也一并收回了,用户将无法登录,报 ORA-01045: user USER_A is not authorized to log on。
- 若只需禁建表但允登录,**不要收 CONNECT**,只收
RESOURCE和UNLIMITED TABLESPACE - 若连登录都要限制,可改用:
ALTER USER user_a ACCOUNT LOCK,比收权限更干净 - 已存在的会话不受影响,新连接才受控;建议通知用户重连,或等连接池自动轮换
容易被忽略的隐性依赖
最常踩的坑是没查清权限来源:用户可能没直接被授 RESOURCE,而是通过另一个角色(比如 APP_DEVELOPER)间接继承的。此时只对用户执行 REVOKE RESOURCE 毫无作用。
- 查间接路径:
SELECT granted_role, admin_option FROM dba_role_privs WHERE grantee IN (SELECT granted_role FROM dba_role_privs WHERE grantee = 'USER_A') - 脚本批量回收时,务必跳过
SYS、SYSTEM、OUTLN等内置账户 - 回收后立即验证:
SELECT * FROM session_privs(当前会话)、SELECT * FROM dba_sys_privs WHERE grantee = 'USER_A'(全局视图)
真正的“安全收回”,不是执行一条 REVOKE,而是确认权限链断裂、配额归零、且无其他角色兜底——这三步缺一不可。


















