您的位置:首页 > 数据库 > Oracle

探秘Oracle表空间、用户、表之间的关系

2015-10-31 15:46 253 查看
背景

  之前的DRP项目虽然用到了oracle,但是所有数据库对象的建立都是按文档来的,并没有仔细思考总结,后面再次用到oracle时,不能再那么糊里糊涂的用了,得稍微探索一下下了,究竟这些oracle中的数据库对象之间都存在什么关系呢?

  Think about it,在SQL Server或者MySQL中,一般情况下(暂不考虑多租户等特殊情况),一个项目对应DBMS中的一个数据库,连接字符串中是用“用户名+密码+数据库名”来唯一标识数据库,一个用户可以管理多个数据库;而连接oracle中的字符串主要是用户名+密码来标识数据库,即一个用户管理一个方案(方案就是某用户拥有的所有的数据库对象的逻辑集合,可以看做是SQL Server或MySQL中的一个数据库)。

  通俗来说,除了数据库地址,一个程序连接MySQL或SQLServer需要提供用户名、密码和它需要连接的数据库名,连接Oracle则需要提供用户名和密码即可。

Oracle中建立表空间、用户、表

  下面通过一个在oracle中建立方案的例子来说明oracle中表空间、用户、表之间的关系。

  一般在oracle中建立方案的步骤为:创建表空间→创建用户并设置其表空间和权限→创建数据库对象(表、视图、索引等)

  (1)先用system用户登录oracle

  (2)新建表空间:

create tablespace tbs_danny datafile 'D:\oracle\oracledata\danny\danny_data.dbf' size 50M;


   


  (3)新建用户并为此用户分配默认的表空间:

create user danny identified by danny default tablespace tbs_danny;


   


  (4)为用户授权

  刚才建立的用户,只是个空壳,神马权限都没有。

  如果不为其分配connect的权限,则连登录都会被拒绝:

  

  


  为其设置了connect权限之后,就可以登录了:

   


  除此之外,还要为其设置resource权限,这样用户才有权查看、修改属于自己的数据库对象:

grant resource to danny;


  (5)建立表

create table t_user_by_danny(id varchar(32),name varchar(32)) tablespace tbs_danny;


  当然也可以不指定表空间

create table t_user_by_danny(id varchar(32),name varchar(32));


  查询一下,在表空间tbs_danny下属于用户danny的表已经有了:

   


  建表时如果不指定表空间,表自动放到默认表空间下。

  到这里,最简单的方案基本上就完成了。

分析总结

  下面用一张图来分析一下上面的过程

  


  一个方案对应一个项目,对应一个用户;每个用户可以管理多个表空间,每个表空间由一个或多个物理文件(.dbf)组成,一个用户可以分配多个表空间,但只能有一个默认表空间,每张表可以存在于一个或多个表空间中(比如图中的表1)。

  如果您有点好奇心,可能会问道,那多个用户可以共享一个表空间吗?答案是可以的,所以这张图可以这么画:

  


  接着上面的例子,如果再建立一个用户xiaohu,并且设置xiaohu的默认表空间也是tbs_danny,并在用户xiaohu下建立表t_user_by_xiaohu,也是可以实现的,只不过这两个用户danny和xiaohu都只有权查看和管理属于自己的数据库对象:

  


  只不过一般不会这么做,如果多个用户都共享一个表空间的话,那就体现不了表空间的意义啦!您说是吧 ~_~ 嘿嘿 ~_~

【 转载请注明出处——胡玉洋《探秘Oracle中表空间、用户、表之间的关系》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息