# 同义词(Synonym)是什么
可以把它理解为视图,都是对表的映射, 同义词不占用数据存储空间。
对于不同Schema下的表,可以映射为一个同义词。易于引用其他用户所拥有的表。还可以缩短冗长的表名和对象名。
<br><br>
# 同义词的分类
1. 公有同义词 Public Synonym
数据库中所有的用户都可以使用公用的同义词,公用的同义词往往用来表示一些比较常用的数据对象。
2. 私有同义词 Synonym
由创建它的用户所有。同义词的创建者可以通过授权控制其他用户是否有权访问属于自己对象的权限来使用私有同义词。
<br><br>
# 私有同义词
## 创建私有同义词
CREATE SYNONYM 同义词名 FOR 表名;
```
CREATE SYNONYM HR_EMP FOR hr.employees;
SELECT * FROM hr_emp;
```
## 给与用户创建同义词的权限
GRANT CREATE SYNONYM TO 用户名
```
SQL> show user;
USER is "SYS"
SQL> GRANT CREATE SYNONYM TO scott;
```
给与其他用户访问同义词对象的权限
GRANT SELECT, UPDATE ON 同义词对象名 TO 用户名
```
SCOTT用户下:
GRANT SELECT,UPDATE ON hr_emp2 TO hr;
HR用户下:
SELECT * FROM scott.hr_emp2;
```
## 删除同义词
DROP SYNONYM 同义词名;
```
DROP SYNONYM hr_emp2;
Output: Synonym HR_EMP2 dropped.
```
<br><br>
# 公有同义词
## 创建公有同义词
CREATE PUBLIC SYNONYM 同义词名 FOR 表名;
用户需要有CREATE PUBLIC SYNONYM的权限才能创建公有同义词。
```
sys用户:
GRANT CREATE PUBLIC SYNONYM TO HR;
hr用户:
CREATE PUBLIC SYNONYM HR_EMP FOR employees;
```
## 给予用户对于公有同义词对象的权限
GRANT 对象权限名 ON 公有同义词名 TO 用户;
实际上等于给予用户对于同义词指向对象的SELECT权限。
```
hr用户:
GRANT SELECT ON hr_emp TO LEO;
Leo用户:
SQL> SET LINESIZE 200
SQL> SET PAGESIZE 200
SQL> COL GRANTEE FOR a20;
SQL> COL OWNER FOR a20;
SQL> COL TABLE_NAME FOR a20;
SQL> COL PRIVILEGE FOR a20;
SQL> select grantee, owner, table_name, privilege
2 FROM user_tab_privs
3 WHERE grantee='LEO';
GRANTEE OWNER TABLE_NAME PRIVILEGE
-------------------- -------------------- -------------------- --------------------
LEO HR EMPLOYEES SELECT
```
## 删除公有同义词
DROP PUBLIC SYNONYM 同义词名;
需要有删除公有同义词的权限才能删除。(DROP PUBLIC SYNONYM)
```
SYS用户下:
GRANT DROP PUBLIC SYNONYM TO HR;
hr用户下:
DROP PUBLIC SYNONYM hr_emp;
```
<br><br>
# 公有同义词和私有同义词的不同
公有同义词可以直接通过同义词的名称进行访问。私有同义词需要加入用户名称才能访问。