同义词(Synonym)让用户能够为数据库的一个模式下的对象提供别名。同义词通过掩盖一个对象真实的名字和拥有者,并且对远程分布式的数据库对象给予了位置透明特性以此来提供了一定的安全性。同时使用同义词可以简化复杂的 SQL 语句。同义词可以替换模式下的表、视图、序列、函数、存储过程等对象。
15.1 创建同义词
语法格式
CREATE [OR REPLACE] [PUBLIC] SYNONYM [IF NOT EXISTS] [<模式名>.]<同义词名> FOR [<模式名>.]<对象名>
参数
1.< 同义词名 > 指待创建同义词的名字。不能和系统对象同名。
2.< 对象名 > 指示同义词替换的对象。该对象可以为远程服务器的对象,远程服务器的对象可以通过创建外部链接来获取,详细介绍请参考第 16 章 外部链接。
图例
创建同义词
语句功能
创建一个同义词。
使用说明
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 下的行数,而在非 SH 模式下查询 SELECT COUNT(*) FROM customer_syn 返回的结果为 OE.CUSTOMER 表的行数;
4.若模式对象的私有同义词与系统对象同名,在此模式下不加模式名前缀调用时,系统函数的优先级比私有同义词高,系统包和系统过程的优先级比私有同义词低;
5.如果创建时候没有指定 REPLACE 语法要素,则不允许创建同名同类型同义词(不同类型则可以,这里的不同类型指的是 PUBLIC 和非 PUBLIC);
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 DMsys_123456;
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;