文章出處

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中已經將用戶和其創建對象所屬關聯取消了,而加入了一個全新的架構體系。

 

用戶架構分離的好處

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

 

1. 架構管理與用戶管理分開。多個用戶可以通過角色(role)或組(Windows groups)成員關系擁有同一個架構。在SQL SERVER 2005/2008 中,每個數據庫中的固定數據庫角色都有一個屬于自己的架構,如果我們創建一個表,給它指定的架構名稱為 db_ddladmin,那么任何一個屬于db_ddladmin中的用戶都是可以去查詢、修改和刪除屬于這個架構中的表,但是不屬于這個組的用戶是沒有對這個架構中的表進行操作的權限,有一點必須注意,db_dbdatareader組的成員可以查看所有數據庫中的表,db_dbdatawriter組成員可以修改所有數據庫中 的表,db_owner組成員可以對數據庫所有表進行所有操作,這幾個組的成員可以通過角色獲取到在數據庫中的特殊權限。

2. 在創建數據庫用戶時,可以指定該用戶賬號所屬的默認架構。 ( 建議大家指定)

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點有點難理解,我們來看一張圖,通過這張圖,大家應該能很顯示的理解這一點:

(上圖來自網絡)


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜

    大師兄 發表在 痞客邦 留言(0) 人氣()