CREATE SYNONYM

说明

创建一个同义词。

语法

create_synonym ::=

参数

OR REPLACE

如果指定该选项,那么如果之前已经存在了同名的同义词,则新创建的同义词会把原来的替换掉。等价于先用DROP命令删除这个同义词,然后使用CREATE命令重新定义同名的同义词。需要注意以下两点:其一,创建同义词时指定OR REPLACE选项,但是并没有同名的同义词,那么仍然可以创建成功。其二,使用该选项仅仅可以对已经存在的同名同义词进行重定义,如果是其它同名的数据库对象,例如表、视图、索引等,则无法重新定义。

PUBLIC

把同义词创建在PUBLIC模式下,所有用户都能访问这个同义词。如果指定该选项,则不可再指定schema选项。指定该选项且不指定schema时创建同义词与不指定该选项但指定schema为public时创建同义词等价,即形如 'create public synonym 同义词名' 与 'create synonym public.同义词名' 两种方式创建同义词等价,都创建在public模式下,所有用户都可以访问。

SCHEMA

指定所创建同义词所属的模式,如果不指定则默认为当前的模式。

SYNONYM

同义词的名字,同义词名必须符合标识符规则。同一模式下,不能和表、索引、视图、序列等其它对象同名。

FOR Clause

在此分句中指出所创建的同义词是什么对象的同义词,可以为下述对象创建同义词:

表、视图、序列、包、物化视图以及同义词

for后面的对象不允许被包含在包中。

schema: 表明for后面的对象所属的模式,如果缺失,则默认为当前模式。

dblink: 为远程数据库所拥有的对象创建同义词时,可以指定dblink选项。如果指定dblink但是缺失schema,那么所创建的同义词所依附的对象的schema由dblink中指定(如果为远程数据库中的对象创建同义词,建议指定模式)。如果缺失dblink选项,则默认创建的同义词所引用的对象在本地数据库。

注解

创建同义词时for后面所指定的对象可以是任何对象,也可以是一个不存在的对象,但不能是所创建的同义词本身。

创建同义词时必须要有在同义词所属模式下的创建权限,但不需要考虑在同义词所依赖对象上的权限问题。

使用同义词时,同义词所引用的对象必须是真实存在的允许被同义词引用的对象,而且必须拥有在该对象上相应的操作权限,否则会报错。

在下列DML语句:SELECT、INSERT、UPDATE、 DELETE、EXPLAIN ANALYZE和ANALYZE和下列DDL语句:CREATE、DROP、ALTER、AUDIT、NOAUDIT、GRANT、REVOKE和COMMENT中出现的允许被同义词引用的数据库对象,都可以用其同义词来代替,并且得到相同的操作结果。

但在一条不可分割的相对独立的语句中出现的对象,要么都用该对象的对象名,要么都用该对象的同义词名,即使都用同义词,如果多个同义词引用同一个对象或者嵌套引用同一个对象,也只能全使用某一个同义词,不能混用,否则会报错。为说明该问题,举例如下:

其中t1为表,s1是t1的同义词,y1也是t1的同义词,s2是s1的同义词。

select t1.c1 from s1; 报错。原因:既使用对象名又使用同义词。

select s1.c1 from y1; 报错。原因:使用同一对象的不同同义词。

select s1.c1 from s2; 报错。原因:使用嵌套引用同一对象的不同级同义词。

如果是同一条语句中相对独立的两条语句,则不受上述限制,例如:

select t1.c1 from t1 union select s1.c1 from s1; 正确。

select t1.c1 from t1 where t1.c1 in(select s1.c1 from s1);正确。

如果一个同义词所引用的对象名被修改或者对象被删除,则此同义词失效。但如果此时重新定义一个与之前对象同名的对象,则同义词依然有效,而且所引用的对象为新定义的对象。

示例

示例1: 创建同义词

--  清理环境
DROP TABLE tab1 CASCADE;
DROP SYNONYM syn1;

--  创建表并插入数据
CREATE TABLE tab1(a INT);

INSERT INTO tab1 VALUES(102);

--  创建同义词
CREATE SYNONYM syn1 FOR tab1;


SELECT * FROM syn1;
A(int)      |
------------
102         |
总数目:1


--  删除同义词和表
DROP SYNONYM syn1;
DROP TABLE tab1;

示例2: 替换同义词

--  清理环境
DROP TABLE tab2 CASCADE;
DROP TABLE tab3 CASCADE;
DROP SYNONYM syn2;

--  创建表并插入数据
CREATE TABLE tab2(a INT);

INSERT INTO tab2 VALUES(102);

CREATE TABLE tab3(aa INT, bb INT);

INSERT INTO tab3 VALUES(203, 304);


--  创建同义词
CREATE SYNONYM syn2 FOR tab2;


SELECT * FROM syn2;
A(int)      |
------------
102         |
总数目:1

--  替换同义词
CREATE OR REPLACE SYNONYM syn2 FOR tab3;


SELECT * FROM syn2;
AA(int)      |BB(int)      |
--------------------------
203          |304          |
总数目:1

--  删除同义词和表
DROP SYNONYM syn2;
DROP TABLE tab2;
DROP TABLE tab3;

示例3: 创建同义词(指定引用对象模式名)

--  清理环境
DROP SCHEMA schm3 CASCADE;
DROP SYNONYM syn3;

--  创建模式、表并插入数据
CREATE SCHEMA schm3;

CREATE TABLE schm3.tab3(a INT);

INSERT INTO schm3.tab3 VALUES(103);

--  创建同义词(指定引用对象模式名)
CREATE SYNONYM syn3 FOR schm3.tab3;


SELECT * FROM syn3;
A(int)      |
------------
103         |
总数目:1


--  删除同义词、表和模式
DROP SYNONYM syn3;
DROP TABLE schm3.tab3;
DROP SCHEMA schm3;

示例4: 创建同义词(指定同义词模式名)

--  清理环境
DROP SCHEMA schm4 CASCADE;
DROP TABLE tab4 CASCADE;


--  创建表并插入数据
CREATE TABLE tab4(a INT);

INSERT INTO tab4 VALUES(104);


--  创建模式
CREATE SCHEMA schm4;

--  创建同义词(指定同义词模式名)
CREATE SYNONYM schm4.syn4 FOR tab4;


SELECT * FROM schm4.syn4;
A(int)      |
------------
104         |
总数目:1


--  删除同义词、表和模式
DROP SYNONYM schm4.syn4;
DROP TABLE tab4;
DROP SCHEMA schm4;

示例5: 创建同义词(指定同义词、引用对象模式名)

--  清理环境
DROP SCHEMA schm5 CASCADE;
DROP SCHEMA schm6 CASCADE;


--  创建模式
CREATE SCHEMA schm5;
CREATE SCHEMA schm6;

--  创建表并插入数据
CREATE TABLE schm5.tab5(a INT);

INSERT INTO schm5.tab5 VALUES(605);


--  创建同义词(指定同义词、引用对象模式名)
CREATE SYNONYM schm6.syn5 FOR schm5.tab5;


SELECT * FROM schm6.syn5;
A(int)      |
------------
605         |
总数目:1


--  删除同义词、表和模式
DROP SYNONYM schm6.syn5;
DROP TABLE schm5.tab5;
DROP SCHEMA schm5;
DROP SCHEMA schm6;