【轉】SQL SERVER 2005/2008 中關於架構的理解

       在一次的實際工做中碰到如下狀況,在 SQL SERVER 2008中,新建了一個新用戶去訪問幾張由其餘用戶建立的表,可是沒法進行查詢,提示「對象名'CustomEntry' 無效。」。當帶上了架構名稱以後(如「cus.CustomEntry」),卻又能查詢到表中的數據了,可是查詢語句是已經寫死在了應用程序中的,若是要進行更改,就有很大的工做量, 這是一件很鬱悶的事情。因而想從數據庫層面上解決此問題,在查詢了大量的資料以後,對於SQL SERVER中的架構有所瞭解,並解決以上問題。數據庫

      下面來講說,本身對SQL SERVER 中架構的理解,並在此記錄,以備查。服務器

      在SQL SERVER 2000中不存在上面所說的問題,那爲何在2008中會出現這樣的事情,這樣的設置能夠帶來哪些好處?致使這一問題的緣由主要在於SQL SERVER 2005/2008中多了一個新的概念——架構。架構

       首先,咱們來看一下微軟對架構的官方定義:架構(Schema)是造成單個命名空間的數據庫實體的集合。命名空間是一個集合,其中每一個元素的名稱都是惟一的。在這裏,咱們能夠將架構當作一個存放數據庫中對象的一個容器。測試

      架構實際上在SQL SERVER 2000中就已經存在,在SQL SERVER 2000中數據庫用戶和架構是隱式鏈接在一塊兒的, 每一個數據庫用戶都是與該用戶同名的架構的全部者。當咱們使用查詢分析器去查詢一個表的時候,一個完整的表的名稱應該包括服務器名.數據庫名.用戶名.對象名,而在SQL SERVER 2005/2008中一個表的徹底限定名稱應該爲服務器名.數據庫名.架構名.對象名對象

      在SQL SERVER 2000中的徹底限定名稱中的「用戶名」也是數據庫中的用戶,也是「架構名」。假若有一個帳戶df在test數據庫中建立了一張表tb1的時候,在查詢分析器中應該輸入的查詢語句爲select * from test.df.tb1,也就是說,在SQL SERVER  2000中一張表所屬的架構默認就是表的建立者的登陸名稱,用戶能夠修改他所建立的全部數據庫對象。但在2008中已經將用戶和其建立對象所屬關聯取消了,而加入了一個全新的架構體系。blog

 

用戶架構分離的好處開發

那麼將架構與數據庫用戶分離對管理員和開發人員而言有什麼好處呢?it

 

1. 架構管理與用戶管理分開。多個用戶能夠經過角色(role)或組(Windows groups)成員關係擁有同一個架構。在SQL SERVER 2005/2008 中,每一個數據庫中的固定數據庫角色都有一個屬於本身的架構,若是咱們建立一個表,給它指定的架構名稱爲 db_ddladmin,那麼任何一個屬於db_ddladmin中的用戶都是能夠去查詢、修改和刪除屬於這個架構中的表,可是不屬於這個組的用戶是沒有對這個架構中的表進行操做的權限,有一點必須注意,db_dbdatareader組的成員能夠查看全部數據庫中的表,db_dbdatawriter組成員能夠修改全部數據庫中 的表,db_owner組成員能夠對數據庫全部表進行全部操做,這幾個組的成員能夠經過角色獲取到在數據庫中的特殊權限。io

2. 在建立數據庫用戶時,能夠指定該用戶帳號所屬的默認架構。 ( 建議你們指定)class

3. 刪除數據庫用戶變得極爲簡單。在 SQL Server 2000 中,用戶(User)和架構是隱含關聯的,即每一個用戶擁有與其同名的架構。所以要刪除一個用戶,必須先刪除或修改這個用戶所擁有的全部數據庫對象,就好比 一個員工要離職要刪除他的帳戶的時候,還得將他所建立的表和視圖等都刪除,影響過大。SQL SERVER 2005/2008將架構和對象者分離後就不在存在這樣的問題,刪除用戶的時候不須要重命名該用戶架構所包含的對象,在刪除建立架構所含對象的用戶後,再也不須要修改和測試顯式引用這些對象的應用程序。

 

4. 共享缺省架構使得開發人員能夠爲特定的應用程序建立特定的架構來存放對象,這比僅使用管理員架構(DBO schema)要好。

5. 在架構和架構所包含的對象上設置權限(permissions)比之前的版本擁有更高的可管理性。

6. 區分不一樣業務處理須要的對象,例如,咱們能夠把公共的表設置成pub的架構,把銷售相關的設置爲sales,這樣管理和訪問起來更容易。

大多數用戶在建立對象的時候習慣直接輸入對象名而將對象的架構名稱省略,在2005/2008 中,會給用戶建立的這樣的表加上一個缺省的架構,用戶若是沒有對本身的默 認架構作設置,那缺省架構就是dbo,也就是說,若是一個db_ddladmin的成員在數據庫中建立一個沒有加上架構名稱的表,這個表在數據庫中的完整 名稱應該是dbo.表名,建立者在數據庫中若是不是屬於其它特殊組的成員,是不能對本身建立的表進行任何修改和查詢的,那就至關於把本身賺的錢存進了別人的銀行卡,本身卻取不出來。

 

 

7 若不指定默認架構,則爲DBO,爲了向前兼容,早期版本中的對象遷移到新版本中,早期版本中沒有架構的概念的。因此就該對象的架構名就是dbo.在SQL Server 2008中,DBO就是一個架構

8 當查找對象時,先找與用戶默認架構相同的架構下的對象,找不到再找DBO的對象

第8點有點難理解,咱們來看一張圖,經過這張圖,你們應該能很顯示的理解這一點:

相關文章
相關標籤/搜索