私有同义词不可授权给其他用户,因其仅为创建者模式下的别名,不具独立授权属性,访问权限完全继承自目标对象且仅限自身会话;正确做法是目标用户自行创建(需具备相应权限)或使用公有同义词。
不能直接“授权私有同义词”给其他用户——私有同义词天然不可跨用户访问,必须靠目标用户自己创建,或改用公有同义词。
为什么不能 GRANT SELECT ON my_syn TO other_user?
Oracle 不允许对私有同义词执行 GRANT 操作。尝试运行 GRANT SELECT ON emp_syn TO scott; 会报错:ORA-01720: grant option does not exist for 'hr.employees' 或更直白的 ORA-02030: can only select from fixed tables/views(取决于底层对象类型)。因为私有同义词只是当前用户模式下的一个别名定义,不是独立可授权的对象;它的访问权限完全继承自它指向的目标对象(如表、视图),且仅限于创建者自身会话可见。
正确做法:让目标用户自己创建私有同义词
前提是目标用户已获得对源对象的必要权限(如 SELECT),且被授予 CREATE SYNONYM 系统权限。
- 源用户(如
hr)先授予权限:GRANT SELECT ON employees TO scott; - DBA 或具备权限者授予创建同义词能力:
GRANT CREATE SYNONYM TO scott; -
scott自己登录后创建:CREATE SYNONYM emp FOR hr.employees;
此时 scott 就能直接 SELECT * FROM emp;,无需写 hr.employees。
想让多个用户统一用同一个名字访问?用 PUBLIC 同义词
如果目标是让 scott、bi_app、report_user 都能用 emp 访问 hr.employees,就必须走公有同义词路径:
- 只有具备
CREATE PUBLIC SYNONYM权限的用户(通常是 DBA)能执行:CREATE PUBLIC SYNONYM emp FOR hr.employees; - 仍需确保所有目标用户都有
SELECT权限:GRANT SELECT ON hr.employees TO scott, bi_app, report_user; - 注意名称冲突:
emp在整个数据库中必须唯一;若已有CREATE PUBLIC SYNONYM emp FOR sales.customers;,再建就会失败
容易忽略的关键点
同义词不自动刷新——哪怕 hr.employees 被重命名成 hr.staff 或被 DROP TABLE,已存在的同义词依然留在数据字典里,直到有人第一次查询它时才抛出 ORA-00980: synonym translation is no longer valid。没人查就一直“活”着,但实际已失效。检查是否有效,不能只看 USER_SYNONYMS,得结合 SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME = 'EMP' AND STATUS = 'INVALID';。











