普通用户能创建PUBLIC SYNONYM是因为被显式授予该权限或拥有DBA角色(含隐式权限);撤销需先查角色来源、再撤角色或直接授权,并验证CREATE PUBLIC SYNONYM失败及DBA角色未激活。

为什么普通用户能创建 PUBLIC SYNONYM?
默认情况下,普通用户没有 CREATE PUBLIC SYNONYM 权限,但只要 DBA 显式授予过这个权限,用户就能执行 CREATE PUBLIC SYNONYM。更隐蔽的是:如果用户被授予了 DBA 角色,该角色自带 CREATE PUBLIC SYNONYM(且无法被单条 REVOKE 覆盖);同理,RESOURCE 角色虽不包含它,但常与 DBA 一起授予,容易被忽略。
撤销 CREATE PUBLIC SYNONYM 权限的实操要点
仅执行 REVOKE CREATE PUBLIC SYNONYM FROM username; 往往无效——因为权限可能来自角色而非直接授予。必须分三步确认并清理:
- 查来源:
SELECT granted_role FROM dba_role_privs WHERE grantee = 'USERNAME';看是否含DBA - 若含
DBA,必须REVOKE DBA FROM username;(单撤CREATE PUBLIC SYNONYM会被角色覆盖) - 再查直接授权:
SELECT privilege FROM dba_sys_privs WHERE grantee = 'USERNAME' AND privilege = 'CREATE PUBLIC SYNONYM';,存在则REVOKE CREATE PUBLIC SYNONYM FROM username;
验证是否真正失效的关键测试
别信命令返回 “revoke succeeded”,登录目标用户后立即试:
-
CREATE PUBLIC SYNONYM test_pub FOR dual;—— 应报ORA-01031: insufficient privileges -
SELECT * FROM session_roles;—— 确认DBA不在结果中 -
SELECT * FROM dba_synonyms WHERE synonym_name = 'TEST_PUB' AND owner = 'PUBLIC';—— 返回空行才算干净
容易被忽略的隐性风险点
即使权限已清,仍可能绕过:
- 用户若拥有
CREATE ANY SYNONYM(极少但存在),也能建公有同义词,需一并REVOKE CREATE ANY SYNONYM FROM username; - 公有同义词一旦创建,删除需
DROP PUBLIC SYNONYM,普通用户无权删,只能由 DBA 或原创建者(如果是 DBA 创建的)操作 - 同义词指向的对象权限独立于同义词本身——即使禁止建同义词,用户仍可能通过全名访问已授权对象


















