1. 程式人生 > >探祕Oracle表空間、使用者、表之間的關係

探祕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)新建表空間:

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都只有權檢視和管理屬於自己的資料庫物件:

  這裡寫圖片描述

  只不過一般不會這麼做,如果多個使用者都共享一個表空間的話,那就體現不了表空間的意義啦!您說是吧 ~_~ 嘿嘿 ~_~