背景
之前的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都只有权查看和管理属于自己的数据库对象:
只不过一般不会这么做,如果多个用户都共享一个表空间的话,那就体现不了表空间的意义啦!您说是吧 _ 嘿嘿 _