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;