我相信很多人接觸這些概念的時候一頭霧水。要把這些概念理清楚真不是件容易的事,哪像原始社會,只要能分清楚什麼能吃什麼不能吃就行了。
但是我始終堅信,每一個概念的產生必然是因為碰到了無法解決的問題。換句話說,如果沒有它,必然會導致某些問題難以解決。所以我想從這個角度切入,希望能把這幾個復雜而暧昧的多角關系從最實用的角度來闡述清楚。
數據庫對象。首先,數據庫對象是比較容易懂的。所有的表,視圖,存儲過程,觸發器都稱為數據庫對象。
我們可以拿一個網站來做類比。一個網站包含很多的網頁,圖片,腳本文件,我們姑且稱它為網站對象。
顯然,我們不可能把所有的網站對象都放到一個文件夾下面,同樣道理,數據庫對象也不可能象煮餃子一樣就在數據庫裡這麼一鍋出。對於網站,我們通常會把不同模塊的文件放在不同的子文件夾下,那麼誰是存放數據庫對象的文件夾呢?答案就是:架構(Schema).
架構(Schema)。微軟的官方說明(MSDN): "數據庫架構是一個獨立於數據庫用戶的非重復命名空間,您可以將架構視為對象的容器".我們知道,在Java中,命名空間名其實就是文件夾名。因此我們非常明確一點:一個對象只能屬於一個架構,就像一個文件只能存放於一個文件夾中一樣。與文件夾不同的是,架構是不能嵌套的,如此而已。因此,我們要訪問一個數據庫對象的時候,通常應該是引用它的全名"架構名. 對象名",這點非常類似C#。
問:為什麼有的時候寫select * from tablename也可以執行呢?
答:這是因為default schema.當只寫tablename時,sql server會自動加上當前登錄用戶的default schema。
如果此表不屬於當前登錄用戶的default schema,將會提示無效的對象名。
加上shcema以後成功。
不過我們也可以更改當前用戶的default schema,這時就可以不用加前綴了。
ALTER USER dbo WITH DEFAULT_SCHEMA =emdbuser;
當然,我們也可以改變此表的schema,相當於把這個表放到另一個文件夾,從emdbuser放到dbo中。
alter schema dbo TRANSFER emdbuser.Borrower
結論:架構就是數據庫對象的容器。數據庫對象是飲料,架構就是杯子,誰拿杯子喝水呢?當然是用戶,那麼是不是一個用戶只能用一個杯子,一個杯子是不是從一而終,只能給一個人用呢?。請看第二節。
關鍵詞:架構