同义词是数据库模式对象的个别名称,通常是为了简化对象访问和对象访问的安全性。
数据库将同义词翻译成相应模式对象的名称。
与视图类似,同义词不占用实际存储空间,只保存在数据字典中。数据库管理员可以根据实际情况为数据库中的一些数据库对象定义同义词,如表、视图、同义词、序列、存储过程等。隐藏对象的名称和所有者。

----------------------------- ---------------同义词 ----------------------------- --同义词查询(oracle才有) select * from user_sysnonyms; --1,创建student表的同义词 CREATE PUBLIC SYNONYM stu FOR student; --2,创建以及替换的方式 create OR REPLACE public SYNONYM stu FOR student; drop synonym public.stu; drop synonym public.stu1; --3.创建自定义模式schm,验证在私有模式下创建共有表的同义词 CREATE SCHEMA schm; CREATE SYNONYM schm.syn_tab FOR public.tab; --tab不存在 SELECT * FROM schm.syn_tab; --报错ERROR: relation "SCHM.SYN_TAB" does not exist --SYS_SYNONYM视图中查询同义词信息 SELECT * FROM SYS_SYNONYM WHERE synname = 'SYN_TAB'; --同义词定义信息 --4,私有同义词和共同同义词可以同名 --创建tb表 CREATE TABLE public.tb(id int); INSERT INTO TB VALUES(1); select * from tb; --tabl它不存在,但我仍然可以为它创造 --同时,私有同义词和共同同义词可以同名 CREATE PUBLIC SYNONYM syn_tabl FOR tabl; CREATE SYNONYM schm.syn_tabl FOR tabl; --5,视图查询同义词 --查询视图中的信息 SELECT syn.synname, sp.nspname FROM SYS_SYNONYM as syn, SYS_NAMESPACE AS sp WHERE syn.synnamespace = sp.oid; --6,在私有schm模式中为public同义词模式下的表创建 CREATE SYNONYM schm.syn_tb FOR public.tb; --共有已经创建tb表,但这个同义词是私有的 SELECT * FROM SYS_SYNONYM WHERE synname = 'syn_tb'; ---syn_t和SYS_TB不同的是,变量要区分大小写!!!! --撒也找不到啊,手表也有,同义词也有 SELECT status FROM ALL_OBJECTS WHERE object_name = 'syn_tab'; SELECT * FROM schm.syn_tb; --查询同义词信息(只有一个编号为1) --删除相关表后,同义词变为无效状态,重新创建。则有效 DROP TABLE public.tb; SELECT status FROM ALL_OBJECTS WHERE object_name = 'syn_tab'; --删除tb表后,信息无法查询,同义词状态无效(报错关系不存在) SELECT * FROM schm.syn_tb; ---创建上的一些限制 ---a,不能指定创建公共同义词的模式,(将报错) CREATE PUBLIC SYNONYM schm.syn_tt FOR public.tab; ERROR: PUBLIC can not be used when schema name specified for synonym name LINE 1: CREATE PUBLIC SYNONYM schm.syn_tt FOR public.tab; ---b,创建私有的,必须指定模式(以下示例未指定同义词名称,报错) CREATE SYNONYM sys FOR public.tab; set SEARCH_PATH to schm,public; ---c,创建私有同义词不能指定为PUBLIC。 --错误的原因是私有同义词,但我们指定了共同模式 CREATE SYNONYM public.syn_tab1 FOR public.tab1; create table schm.company( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) ); --因为前面执行了这个set SEARCH_PATH to schm,public; --默认模式路径已经改变 show search_path; --直接在下表中创建schm中 create table company1( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) ); --大清理 drop synonym schm.syn_tb; drop synonym schm.syn_tab; drop synonym public.syn_tabl; --创建表的简单视图,准备同义词 create force view age_view as select stu_nmb,stu_name from student where age > 20 and gender = '男' with local check option ;--可选,限定DML语句操作必须满足一定条件 CREATE PUBLIC SYNONYM stu1 FOR age_view; select * from stu1; ----------------------------------------------------------- -------------------------------创建实验表------------------- ----------------------------------------------------------- drop table if exists student; --oracle没有这种语法,mysql和KES存在 CREATE TABLE student ( stu_nmb number(8), stu_name char(8) not null, gender varchar2(2), age number(2), --检查约束 class varchar2 (40) not null, email varchar2 (30), sdate DATE, constraint con_nmb primary key (stu_nmb), constraint con_check check ( gender in (男,女), constraint ch_age CHECK (age BETWEEN 18 AND 30), --检查约束 constraint uk_student_email UNIQUE (email) ); --首先插入,正确 INSERT INTO student VALUES(2314,张德田,男,19,高三第六班,28@qq.com',SYSDATE); INSERT INTO student VALUES(4324,吴海峰,男,18,高三第一班,21@qq.com',SYSDATE); INSERT INTO student VALUES(2614,章德正,男,20,高三第八班,24@qq.com',SYSDATE); INSERT INTO student VALUES(2184,宋义,女性,20,高三第三班,98@qq.com',SYSDATE); INSERT INTO student VALUES12.@qq.com',SYSDATE); INSERT INTO student VALUES(1474,黎文,女,19,高三第四班,13@qq.com',SYSDATE); INSERT INTO student VALUES(6574,吉祥,男,21,高三第7班,22@qq.com',SYSDATE); INSERT INTO student VALUES(8174,向玲,女三第一班,23@qq.com',SYSDATE); INSERT INTO student VALUES(1414,梅田田,21,高三第7班,25@qq.com',SYSDATE); select * from student; --测试同义词 select * from stu;