CREATE SYNONYM 
===================================



描述 
-----------

该语句用来创建一个同义词。

格式 
-----------

```javascript
CREATE [ OR REPLACE ] [ PUBLIC ]
SYNONYM [ DATABASE. ]synonym
FOR [ DATABASE. ]object;
```





参数说明 
-------------



|         **参数**         |                                                                                          **描述**                                                                                          |
|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| OR REPLACE             | 表示如果要创建的同义词名称已存在，则使用新的定义重新创建同义词。                                                                                                                                                         |
| PUBLIC                 | 指定PUBLIC来创建公共同义词，所有用户都可以使用。用户必须对基础对象具有相应的权限才能使用该同义词。 在解析对象的引用时，仅当对象没有指定DataBase时，才会使用公共同义词。 如果不指定PUBLIC，则同义词是私有的，只能当前DataBase访问，并且同义词名称在当前DataBase中必须唯一。 |
| \[ DataBase. \]synonym | DataBase指定当前同义词属于哪个DataBase，如果指定了PUBLIC，则对同义词不需要指定DataBase；synonym表示同义词的名称。                                                                                                              |
| \[ DataBase. \]object  | 表示同义词对应对象的名称。                                                                                                                                                                            |





举例 
-----------

* 创建一个同义词。




```javascript
OceanBase(admin@test)>create table t1(c1 int);
Query OK, 0 rows affected (0.18 sec)

OceanBase(admin@test)>create synonym s1 for t1;
Query OK, 0 rows affected (0.05 sec)

OceanBase(admin@test)>insert into s1 values(1);
Query OK, 1 row affected (0.02 sec)

OceanBase(admin@test)>select * from s1;
+------+
| c1   |
+------+
|    1 |
+------+
1 row in set (0.01 sec)
```



* 创建一个PUBLIC同义词




```javascript
OceanBase(admin@test)>create public synonym syn_pub for t1;
Query OK, 0 rows affected (0.03 sec)

OceanBase(admin@test)>select * from syn_pub;
+------+
| c1   |
+------+
|    1 |
+------+
1 row in set (0.01 sec)
```





注意事项 
-------------

创建同义词时，需要满足如下权限要求：

* 在当前的DataBase下创建私有的synonym，需要CREATE SYNONYM权限

* 在非当前DataBase下创建私有的synonym，需要CREATE ANY SYNONYM权限

* 创建PUBLIC的synonym，需要CREATE PUBLIC SYNONYM权限

* 对于需要创建synonym的对象不需要存在，也不需要具有访问权限




```javascript
连接sys用户:
OceanBase(ADMIN@TEST)>CREATE USER syn_user IDENTIFIED BY syn_user;
Query OK, 0 rows affected (0.06 sec)

OceanBase(ADMIN@TEST)>grant CREATE on syn_user.* to syn_user;
Query OK, 0 rows affected (0.02 sec)

OceanBase(ADMIN@TEST)>grant SELECT on syn_user.* to syn_user;
Query OK, 0 rows affected (0.03 sec)


连接syn_user
//创建同义词失败
OceanBase(SYN_USER@(none))>create synonym syn_1 for t1;
ERROR-00600: internal error code, arguments: -5036, Access denied; you need (at least one of) the CREATE SYNONYM privilege(s) for this operation

连接sys用户,给定CREATE SYNONYM权限
OceanBase(ADMIN@TEST)>grant CREATE SYNONYM on *.* to syn_user;
Query OK, 0 rows affected (0.03 sec)

连接syn_user
OceanBase(SYN_USER@(none))>create synonym syn_1 for t1;
Query OK, 0 rows affected (0.05 sec)
```



