同义词(Synonym)让用户能够为数据库的一个模式下的对象提供别名。同义词通过掩盖一个对象真实的名字和拥有者,并且对远程分布式的数据库对象给予了位置透明特性以此来提供了一定的安全性。同时使用同义词可以简化复杂的SQL语句。同义词可以替换模式下的表、视图、序列、函数、存储过程等对象。
15.1 创建同义词
语法格式
CREATE [OR REPLACE] [PUBLIC] SYNONYM [<模式名>.]<同义词名> FOR [<模式名>.]<对象名>
参数
1.<同义词名> 指被定义的同义词的名字;
2.<对象名> 指示同义词替换的对象。
图例
创建同义词
语句功能
创建一个同义词。
使用说明
1.同义词分为全局同义词(PUBLIC SYNONYM)和非全局同义词。用户在自己的模式下创建同义词,必须有CREATE SYNONYM权限。用户要创建全局同义词(PUBLIC SYNONYM),必须有CREATE PUBLIC SYNONYM权限;
2.全局同义词创建时不能指定同义词的模式名限定词,它能够被所有用户使用,使用时不需要加任何模式限定名。非全局同义词被非同义词所属模式拥有者引用需要在前面加上模式名;公有同义词和私有同义词,可以具有相同的名字;非全局同义词不能与目标对象同名;
3.用户使用SQL语句对某个对象进行操作,那么解析一个对象的顺序,首先是查看模式内是否存在该对象,然后再查看模式内的同义词(非全局同义词),最后才是全局同义词。例如,用户OE和SH在他们的模式下都有一个表叫customer,SYSDBA为OE模式下的customer表创建了一个全局同义词customer_syn,SYSDBA为SH模式下的customer表创建了一个私有同义词customer_syn,如果用户SH查询:SELECT COUNT(*) FROM customer_syn,则此时返回的结果为SH.CUSTOMER下的行数,而如果需要访问OE模式下的CUSTOMER表,则必须在前面加模式名:SELECT COUNT(*) FROM OE.customer_syn;
4.如果创建时候没有指定REPLACE语法要素,则不允许创建同名同类型同义词(不同类型则可以,这里的不同类型指的是PUBLIC和非PUBLIC);
5.同义词创建时,并不会检查他所指代的同义词对象是否存在,用户使用该同义词时候,如果不存在指代对象或者对该指代对象不拥有权限,则会报错。
6.当INI参数ENABLE_PL_SYNONYM=0时,禁止通过全局同义词执行非系统用户创建的包或者DMSQL程序。
举例说明
例1 用户B对A模式下的表T1创建同义词。
在A模式下建立表T1。
CREATE TABLE "A"."T1" ("ID" INTEGER, "NAME" VARCHAR(50), PRIMARY KEY("ID"));
INSERT INTO "A"."T1" ("ID", "NAME") VALUES (1, '张三');
INSERT INTO "A"."T1" ("ID", "NAME") VALUES (2, '李四');
对A模式下的表T1创建同义词。
CREATE SYNONYM A.S1 FOR A.T1;
如果用户B想查询T1表的行数,可以通过如下语句来获得结果:
SELECT COUNT(*) FROM A.S1;
例2 当INI参数ENABLE_PL_SYNONYM=0时,禁止通过全局同义词执行非系统用户创建的包或者DMSQL程序。
1. dba登录创建新用户并赋予创建同义词权限
--SYSDBA登录
create user DBSEC identified by 123456789;
GRANT CREATE PUBLIC SYNONYM TO DBSEC;
grant resource to DBSEC;
2. 创建同义词。通过同义词调用DMSQL程序。
--DBSEC登录
CREATE OR REPLACE FUNCTION GET_DBA2(a INT, b INT) RETURN INT AS
s INT;
BEGIN
s:=a+b;
RETURN s;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/
CREATE OR REPLACE PUBLIC SYNONYM SP_CLOSE_SESSION FOR GET_DBA2;--创建同义词
call SP_CLOSE_SESSION (1,2); --报错无法解析的成员访问表达式[SP_CLOSE_SESSION]
15.2 删除同义词
语法格式
DROP [PUBLIC] SYNONYM [IF EXISTS] <同义词名>
参数
<同义词名> 指被定义的同义词的名字。
图例
删除同义词
语句功能
删除一个同义词。
使用说明
- 删除不存在的同义词会报错。若指定IF EXISTS关键字,删除不存在的同义词,不会报错;
- 必须是DBA或者拥有此同义词的用户才能删除该同义词;
- 如果要删除公有同义词,则必须要指定PUBLIC,因为在达梦数据库中,公有同义词和私有同义词可以同名,所以如果不指定,则删除的是当前模式下的同名同义词;
- 删除公有同义词,需要指定PUBLIC,而删除私有同义词,则不能指定,否则报错;如果删除当前模式下的同义词,可以不指定模式名,如果删除其它模式下的同义词,需要指定相应的模式名,否则报错。
举例说明:
例1 删除模式A下的同义词S1。
DROP SYNONYM A.S1;
例2 删除公有同义词S2。
DROP PUBLIC SYNONYM S2;