同义词(Synonym),是一种数据库对象
提供一个别名来引用另一个数据库对象(如表、视图、序列、过程、函数等)
同义词分为全局同义词(PUBLIC SYNONYM)和非全局同义词。用户在自己的模式下创建同义词,必须有CREATE SYNONYM权限。用户要创建全局同义词(PUBLIC SYNONYM),必须有 CREATE PUBLIC SYNONYM 权限;
作用
简化对象引用
- 别名简化:通过为复杂的对象名称或路径创建同义词,可以简化SQL查询中的引用。例如,如果表的全路径是
schema_name.table_name
,可以创建一个同义词simple_name
来引用它。 - 跨数据库引用:在分布式数据库环境中,同义词可以用来引用远程数据库中的对象,从而避免在查询中硬编码远程数据库的连接信息。
提高代码的可读性和可维护性
- 抽象层:同义词提供了一个抽象层,使得数据库对象的名称变化不会影响到应用程序代码。例如,如果表名发生变化,只需更新同义词的定义,而无需修改所有引用该表的代码。
- 标准化:通过为不同数据库对象创建统一的同义词,可以确保应用程序代码中使用的是标准化的名称。
同义词的使用
语法
CREATE [OR REPLACE] [PUBLIC] SYNONYM [IF NOT EXISTS] [<模式名>.]<同义词名> FOR [<模式名>.]<对象名>
<同义词名> 指待创建同义词的名字。不能和系统对象同名。
<对象名> 指示同义词替换的对象。该对象可以为远程服务器的对象,远程服务器的对象可以通过创建外部链接来获取
示例
创建公共同义词
--建表,执行如下SQL命令
create table TAB_FUT_TYC_CJGG (c1 int,c2 varchar(10));
insert into TAB_FUT_TYC_CJGG values(1,'test');
commit;
--建表TAB_FUT_TYC_CJGG的同义词,执行如下SQL命令
CREATE OR REPLACE PUBLIC SYNONYM SYN_FUT_TYC_CJGG FOR SYSDBA. TAB_FUT_TYC_CJGG;
--通过同义词查询对应表数据,执行如下SQL命令
select * from SYN_FUT_TYC_CJGG;
创建非公共同义词
--管理员新建一个用户,并授予建表、建同义词权限:
create user "A" identified by "aaa123456";
grant create table to A;
grant create synonym to A;
用户A新建一个到数据库的连接
--用户A在A 模式下建立表T1:
CREATE TABLE TAB_FUT_TYC_CJFG (ID INTEGER, NAME VARCHAR(50), PRIMARY KEY(ID));
INSERT INTO A.TAB_FUT_TYC_CJFG (ID, NAME) VALUES (1, '张三');
INSERT INTO A.TAB_FUT_TYC_CJFG (ID, NAME) VALUES (2, '李四');
--用户A对A 模式下的表T1 创建同义词(属于非公共同义词):
CREATE SYNONYM SYN_FUT_TYC_CJFG FOR A.TAB_FUT_TYC_CJFG;
--用户A通过同义词查询表T1的数据:
SELECT * FROM A.SYN_FUT_TYC_CJFG;
创建dblink同义词
--管理员用户给A用户授权能创建数据库链接
grant create LINK to A;
--A用户建表,执行如下SQL命令
create link "FUT_TYC_LINK" connect 'DPI' with "SYSDBA" identified by "SYSDBA" using '127.0.0.1:5236';
--A用户建FUT_TYC_LINK的同义词,执行如下SQL命令
create table TAB_FUT_TYC_CJGG (c1 int,c2 varchar(10));
insert into TAB_FUT_TYC_CJGG values(1,'test');
commit;
create synonym TEST_LINK_SYNONYM for TAB_FUT_TYC_CJGG@FUT_TYC_LINK;
--A用户测试通过dblink同义词访问dblink对端表
select * from TEST_LINK_SYNONYM;
创建视图同义词
--建表:
create table student(id int, name char(10), sex char(2), bithdate date, house_place varchar, classid char(10));
insert into student values(10001, '张强','男', '1990-12-1','湖北省武汉市武昌区', '1-3');
insert into student values(10002, '李凯','男', '1983-8-1','湖北省武汉市江汉区','1-2');
insert into student values(10003, '王可','女', '1980-11-7','湖北省武汉市青山区','2-1');
insert into student values(10004, '许畅','女', '1993-7-13','湖北省武汉市青山区','3-2');
--创建视图和查询视图:
create or replace view person as select id, name, house_place from student where sex='女';
select * from person;
--创建视图同义词
CREATE SYNONYM person_syn FOR person;
--通过同义词查询视图中的的数据
select * from person_syn;
创建存储过程同义词
--建表:
create table FUT_TYC_CCGC(c1 int, c2 char(10), c3 varchar(20));
insert into FUT_TYC_CCGC values(1,'a','aaaaa');
insert into FUT_TYC_CCGC values(2,'b','bbbbb');
insert into FUT_TYC_CCGC values(3,'c','ccccc');
--创建存储过程:
create or replace procedure proc1 is total int;
begin
select count(*) into total from FUT_TYC_CCGC;
print total;
end;
/
--创建存储过程同义词
CREATE SYNONYM proc1_syn FOR proc1 ;
--通过同义词调用存储过程
call proc1_syn();
创建序列同义词
--创建表和序列:
create table FUT_TYC_XLTYC(c1 int,c2 varchar(10));
create sequence seq1 start with 1 increment by 10;
--将序列的前两个值插入到表中:
insert into FUT_TYC_XLTYC values(seq1.nextval,'test');
insert into FUT_TYC_XLTYC values(seq1.nextval,'test2');
--创建序列同义词
CREATE SYNONYM seq1_syn FOR seq1 ;
--通过获取序列的当前值
select seq1_syn.nextval;
创建函数同义词
--创建一个存储函数f1:
create or replace function FUT_TYC_HSTYC(b1 in varchar2)
return varchar2 is
begin print('elapsed time seconds.'||b1);
return b1||'Hello';
end ;
/
select FUT_TYC_HSTYC('zhangsan');
--创建函数同义词
CREATE SYNONYM FUT_TYC_HSTYC_SYN FOR FUT_TYC_HSTYC ;
--通过同义词调用存储过程
select FUT_TYC_HSTYC_SYN('zhangsan');
删除同义词
--删除公共同义词,执行如下SQL命令
drop PUBLIC SYNONYM SYN_FUT_TYC_CJGG;
参考:
https://eco.dameng.com/