有时候会把 oracle 的 user 和 schema 搞混,今天来彻底理解和实战一下 oracle 的 user 和 schema的区别。
一、名词解释
1. 什么是用户
oracle中的用户,和所有系统中的用户概念类似,用户所持有的是系统的资源及权限。
2. 什么是 schema
oracle 中的 schema 就是指一个用户下所有数据库对象(如 tables,views,stored procedures等)的逻辑集合。
schema 本身不能理解成一个对象,oracle 中并没有提供创建 schema 的语法,schema 也并不是在创建 user 的时候就创建,而是在该用户下创建第一个对象之后 schema 也随之产生。只要 user 下存在对象,schema 就一定存在,user 下如果不存在对象,schema 也不存在。
对于一个大型的企业应用,最好针对不同的目的,使用不同的 schema。
比如,可以把会员相关的表放在会员 schema 中,账务相关的表放在账务 schema 中。
在数据库中,一个对象的完整名称为 schema.object,而不是 user.object。在创建对象时,如果我们不指定该对象的 schema,则该对象的 schema 为用户缺省的 schema。
下面这个比喻,很形象生动的说明了 user 和 schema 的关系。
好比一个房子,里面放满了家具,对这些家具有支配权的是房子的主人(user),而不是房子(schema)。你可以也是一个房子的主人(user),拥有自己的房子(schema),也可以进入别人的房子(通过 alter session set current_schema = <> 的方式)。
如果你没有特别指定的话,你所做的操作都是针对你当前所在房子中的东西。
至于你是否有权限使用 (select)、搬动 (update) 或者拿走 (delete) 这些家具就看这个房子的主人有没有给你这样的权限了,或者你是整个大厦 (DB) 的老大(DBA),则随意。
二、代码实战来加深对 user 和 schema 的理解
第一步:以 sys 用户登录,并建立普通用户 game(游戏) 和 video(视频)
sqlplus / as sysdba
create user game identified by game;
create user video identified by video;
第二步,赋予一些基本的权限给 game 和 video
grant connect,create table,resource to game,video;
第三步,以不同的用户登入,并且创建一些表
conn game/game
create table my_game(id number(11));
insert into my_game (1);
commit;
conn video/video
create table my_video(name varchar2(32));
insert into my_video ('Jack And Rose');
commit;
第四步:以 game 用户登入,尝试查看其它用户下的表
conn game/game
select * from user_tables;
show user;
select * from view.my_video;
可以看到,我们只能看到当前用户下的表,也不能查看其它用户下的表。
第五步:在 game 用户下,切换 schema 为 video,看能不能访问
alter session set current_schema=video;
可以看到,使用 game 用户仍然无法查看 video 用户下的东西;
第六步:使用 video 用户登录,并且赋予权限给 video 用户
conn video/video
grant select on my_video to game;
第七步:使用 game 用户,看能不能查询 video 的表
发现已经可以查询了
但是是没法删除和 update 的,因为没有足够的权限去操作别的空间的表;
最后
好了,相信通过一些概念和类比,以及一个实战小栗子,相信大家可以更加深刻理解 oracle 中的 user 和 schema 了吧。
但是可能你会犯愁,装一个 oracle 该多麻烦呀!没事,贴心的我已经帮你准备好了一篇,使用 docker 镜像来安装 oracle 的教程,跟着做,就可以得到一个安装好的 oracle 啦!