1、同义词
- Oracle 中
同义词 synonyms
,其实质就是 对象 的一个"别名"
,此对象可以是Table、View、Package、Function、Procedure、Sequences、Index
等。 - 由于其只是一个
别名
,所以除了 数据字典中的定义不占任何空间(这一点,与视图
类似)
使用同义词常见的好处:
-- 1. 简化对象的访问
-- 2. 安全:屏蔽了对象的名字(一般同义词名和表名一致)及其拥有者(属主)
SELECT * FROM sys.dual; -- 使用同义词前
SELECT * FROM dual; -- 使用同义词后
1.1 前提条件
- 该用户必须拥有
创建 同义词
的权限,可通过下列语句进行查询。
序号 | 权限名 | 解释 |
---|---|---|
1 | CREATE SYNONYM | 创建私有同义词权限 |
2 | CREATE PUBLIC SYNONYM | 创建公有同义词权限 |
3 | CREATE ANY SYNONYM | 上述都有 |
-- 查询权限语句
SELECT t.* FROM dba_sys_privs t WHERE t.privilege LIKE '%SYNONYM%' ORDER BY 1, 2;
SELECT t.* FROM user_sys_privs t WHERE t.privilege LIKE '%SYNONYM%' ORDER BY 1, 2;
-- 系统权限,授权语句
GRANT CREATE ANY SYNONYM TO <其他用户>;
-- 对象权限,授权语句,若其他用户想查询(和表授权是一样的)
GRANT SELECT ON <synonym> TO <其他用户>;
1.2 权限分类及优先级
- 在有私有同义词和公有同义词的相同的情况下,Oracle优先选择私有同义词对象
2、语法
2.1 详细解析
CREATE [PUBLIC] SYNONYM [schema.] <synonym_name>
FOR [schema.] Object[@db_link];
OR REPLACE
- 对于具有任何依赖表或依赖有效用户定义对象类型的类型同义词,不能使用or replace子句。
[ EDITIONABLE | NONEDITIONABLE ]
: 是否启用编辑- 如果对模式中的模式对象类型同义词启用了编辑,请使用这些子句指定同义词是已编辑的对象还是未编辑的对象。对于私有同义词,默认值是可编辑的。对于公共同义词,默认值是不可添加的
PUBLIC
- 指定 public 创建公共同义词。所有用户都可以访问公共同义词。但是,每个用户必须对基础对象拥有适当的权限才能使用同义词。
- 若省略,则为 private 私有的。
schema
- 指定包含同义词的 schema 。如果忽略模式,oracle数据库会在自己的模式中创建同义词。如果指定了public,则不能为同义词指定 schema
synonym
- 如果兼容的初始化参数设置为12.2或更高的值,则同义词名称的最大长度为128字节。数据库将允许您创建和删除长度为129到4000字节的同义词。但是,除非这些较长的同义词名称代表java名称,否则它们在任何其他sql命令中都不起作用。
- 如果兼容的初始化参数设置为低于12.2的值,则同义词名称的最大长度为30字节。数据库将允许您创建和删除长度为31到128字节的同义词。但是,除非这些较长的同义词名称代表java名称,否则它们在任何其他sql命令中都不起作用
SHARING
- 同义词创建后,不能更改其共享属性
FOR
- Table or object table
- View or object view
- Sequence
- Stored procedure, function, or package
- Materialized view
- Java class schema object
- User-defined object type
- Synonym
dblink
- 您可以指定完整或部分数据库链接,以便在对象所在的远程数据库上创建架构对象的同义词
2.2 常用
- 在实际开发中,我们只需要熟悉下面几种语法即可。
- 一般,我们只使用
公有同义词
-- 创建同义词
CREATE [PUBLIC] SYNONYM <synonym_name> FOR owner.object_name;
-- 删除
DROP [PUBLIC] SYNONYM <synonym_name>; -- 当同义词的原对象被删除时,同义词并不会被删除
-- 查询
SELECT * FROM DBA_SYNONYMS;
SELECT * FROM ALL_SYNONYMS;
SELECT * FROM USER_SYNONYMS;
-- 重编译
ALTER SYNONYM <synonym_name> COMPILE; -- 当同义词的原对象被重新建立时,同义词需要重新编译