我相信很多人接觸這些概念的時候一頭霧水。要把這些概念理清楚真不是件容易的事,哪像原始社會,隻要能厘清楚什麼能吃什麼不能吃就行了。
但是我始終堅信,每一個概念的産生必然是因為碰到了無法解決的問題。換句話說,如果沒有它,必然會導緻某些問題難以解決。是以我想從這個角度切入,希望能把這幾個複雜而暧昧的多角關系從最實用的角度來闡述清楚。
<b>在問題的最初,我們假定的資料庫什麼都沒有。</b>
<b>資料庫對象。</b>首先,資料庫對象是比較容易懂的。所有的表,視圖,存儲過程,觸發器都稱為資料庫對象。
我們可以拿一個網站來做類比。一個網站包含很多的網頁,圖檔,腳本檔案,我們姑且稱它為網站對象。
顯然,我們不可能把所有的網站對象都放到一個檔案夾下面,同樣道理,資料庫對象也不可能象煮餃子一樣就在資料庫裡這麼一鍋出。對于網站,我們通常會把不同子產品的檔案放在不同的子檔案夾下,那麼誰是存放資料庫對象的檔案夾呢?答案就是:架構(Schema).
問:為什麼有的時候寫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
以上兩種作法在真實項目中都不應該作為解決方案,因為它改變了原來的設定。我們最希望的是,即使我們以dbo登陸,我們也可以僞裝成emdbuser來操作資料庫對象,僞裝完了還能切換回來。在Sql Server中,剛好有這樣的語句實作這個功能。
EXECUTE AS USER = 'emdbuser';
這種機制被稱為“上下文切換”,操作完以後,可以實用REVERT指令切換回來。(.NET中也有類似的機制,它們有共同的一個名稱叫做Impersonate,
角色扮演。)
<b>問</b>:如何根據表名擷取一個表的Schema呢?
<b>答</b>:可以參照以下SQL語句從sys.objects視圖和sys.schemas視圖中擷取。
<a></a>
select sys.objects.name,
sys.schemas.name
from sys.objects,
sys.schemas
where sys.objects.type='U'
and sys.objects.schema_id=sys.schemas.schema_id
結論:架構就是資料庫對象的容器。資料庫對象是飲料,架構就是杯子,誰拿杯子喝水呢?當然是使用者,那麼是不是一個使用者隻能用一個杯子,一個杯子是不是從一而終,隻能給一個人用呢?。請看第二節。
本文轉自黃聰部落格園部落格,原文連結:http://www.cnblogs.com/huangcong/archive/2010/05/06/1729234.html,如需轉載請自行聯系原作者