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

背景

  之前的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)新建表空间:

<code class="hljs tex has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span style="font-family:Microsoft YaHei;font-size:14px;">create tablespace tbs_danny datafile 'D:<span class="hljs-command" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(0, 0, 136);">\oracle</span><span class="hljs-command" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(0, 0, 136);">\oracledata</span><span class="hljs-command" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(0, 0, 136);">\danny</span><span class="hljs-command" style="margin: 0px; padding: 0px; box-sizing: border-box; color: rgb(0, 0, 136);">\danny</span>_data.dbf' size 50M;</span></code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;"><span style="font-family:Microsoft YaHei;font-size:14px;">1</span></li></ul>

   这里写图片描述

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

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;"><span style="font-family:Microsoft YaHei;font-size:14px;"><span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">create</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">user</span> danny identified <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">by</span> danny <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">default</span> tablespace tbs_danny;</span></span></code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;"><span style="font-family:Microsoft YaHei;font-size:14px;">1</span></li></ul>

   这里写图片描述

  (4)为用户授权 
  刚才建立的用户,只是个空壳,神马权限都没有。 
  如果不为其分配connect的权限,则连登录都会被拒绝: 
   
  这里写图片描述

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

   探秘Oracle表空间、用户、表之间的关系_第1张图片

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

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;"><span style="font-family:Microsoft YaHei;font-size:14px;"><span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">grant</span> resource <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">to</span> danny;</span></span></code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;"><span style="font-family:Microsoft YaHei;font-size:14px;">1</span></li></ul>

  (5)建立表

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;"><span style="font-family:Microsoft YaHei;font-size:14px;"><span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">create</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">table</span> t_user_by_danny(id <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">varchar</span>(<span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">32</span>),name <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">varchar</span>(<span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">32</span>)) tablespace tbs_danny;</span></span></code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;"><span style="font-family:Microsoft YaHei;font-size:14px;">1</span></li></ul>

  当然也可以不指定表空间

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-operator" style="margin: 0px; padding: 0px; box-sizing: border-box;"><span style="font-family:Microsoft YaHei;font-size:14px;"><span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">create</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">table</span> t_user_by_danny(id <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">varchar</span>(<span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">32</span>),name <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">varchar</span>(<span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">32</span>));</span></span></code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;"><span style="font-family:Microsoft YaHei;font-size:14px;">1</span></li></ul>

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

   探秘Oracle表空间、用户、表之间的关系_第2张图片

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

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


分析总结

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

  探秘Oracle表空间、用户、表之间的关系_第3张图片

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

  如果您有点好奇心,可能会问道,那多个用户可以共享一个表空间吗?答案是可以的,所以这张图可以这么画: 
  探秘Oracle表空间、用户、表之间的关系_第4张图片

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

  探秘Oracle表空间、用户、表之间的关系_第5张图片

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

你可能感兴趣的:(oracle)