数据库-同义词

基本概念:

同义词是数据库模式对象的⼀个别名,经常⽤于简化对象访问和提⾼对象访问的安全性。

在使⽤同义词时,数据库将它翻译成对应模式对象的名字。

与视图类似,同义词并不占⽤实际存储空间,只有在数据字典中保存了同义词的定义。在数据库中的⼤部分数据库对象,如表、视图、同义词、序列、存储过程等,数据库管理员都可以根据实际情况为他们定义同义词。隐藏对象名称和所有者。

思维导图总结:

 

测试代码:(KES上实测)

-----------------------------
---------------同义词
-----------------------------
--同义词查询(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,'高三第6班','28@qq.com',SYSDATE);
INSERT INTO student VALUES(4324,'吴海峰','男',18,'高三第1班','21@qq.com',SYSDATE);
INSERT INTO student VALUES(2614,'章德正','男',20,'高三第8班','24@qq.com',SYSDATE);
INSERT INTO student VALUES(2184,'宋义','女',20,'高三第3班','98@qq.com',SYSDATE);
INSERT INTO student VALUES(9874,'张华乐','女',19,'高三第4班','12@qq.com',SYSDATE);
INSERT INTO student VALUES(1474,'黎文','女',19,'高三第4班','13@qq.com',SYSDATE);
INSERT INTO student VALUES(6574,'吉祥','男',21,'高三第7班','22@qq.com',SYSDATE);
INSERT INTO student VALUES(8174,'向玲','女',19,'高三第1班','23@qq.com',SYSDATE);
INSERT INTO student VALUES(1414,'梅田田','女',21,'高三第7班','25@qq.com',SYSDATE);

select * from student;
--测试同义词
select * from stu;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值