標籤:
引用:http://www.cnblogs.com/chillsrc/p/3383098.html
在一次的實際工作中碰到以下情況,在 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點有點難理解,我們來看一張圖,通過這張圖,大家應該能很顯示的理解這一點:
SQL SERVER 2005/2008 中關於架構的理解(一)