SQL查詢是引用表時,需要為其制定模式名。 在數據庫的術語中,模式就是名稱空間。這種方式可以把相同特性的對象組合到一個共同的名稱空間中。模式也可以保護對象,所以DBA可以給模式授予顯示權限。 例如,DBA可以給用戶授予模式的SELECT權限,這樣,用戶就可以從該模式的任意表或視圖中選擇行了。
SQL Server數據庫中的每個對象都用由4部分組成的名字來標識。該名字的形式是 Server.DataBase.Schema.Object。表中的列並不是真正的對象,而是對象的屬性。SELECT子句不指定服務器,只制定數據庫、模式、對象和屬性,而FROM子句要求制定服務器。四部分名字中的一些部分是可選的,如果省略了服務器名,SQL Server就假定查詢運行在當前的服務器連接上。數據庫也是如此, SQL Server假定當前設置的服務器環境就是對象所在的數據庫。
在SQL Server中,每個用戶都被賦予一個默認模式或名稱空間。模式是構成名稱空間的數據庫對象的一個指定集合。名稱空間由單個用戶擁有。在名稱空間中,對象不能重名。但不同名稱空間或不同模式中的對象可以重名。
http://blog.sina.com.cn/s/blog_7952e89001010jlj.html :
數據庫的初學者往往會對關系型數據庫模式(schema)、數據庫(database)、表(table)、用戶(user)之間感到迷惘,總感覺他們的關系千絲萬縷,但又不知道他們的聯系和區別在哪里,對一些問題往往說不出個所以然來。下面,我們就以SQL Server為核心,對其模式(schema)、數據庫(database)、表(table)、用戶(user)之間的關系展開討論。
首先,我們先弄清楚什么是模式。
先明確一點,SQL Server中模式(schema)這個概念是在2005的版本里才提出來的,因此SQL Server2000不支持模式這個概念(本人曾在此處吃過虧)。
模式又稱架構,架構的定義是形成單個命名空間的數據庫實體的集合。命名空間是一個集合,其中每個元素的名稱都是唯一的。在這里,我們可以將架構看成一個存放數據庫中對象的一個容器。
上面的文字描述過於晦澀,舉個簡單的例子,平時要在電腦硬盤存放東西時,我們不會把所有的東西都存在一個文件夾里,而是會把不同的文件按照某一個標准分門別類,放到不同的文件夾里。而在數據庫中,起到這個作用的就是架構,數據庫對象(表、視圖、存儲過程,觸發器等)按照一定的標准,存放在不同的架構里。有過java編程經驗的同學都知道,命名空間名其實就是文件夾名,因此我們非常明確一點:一個對象只能屬於一個架構,就像一個文件只能存放於一個文件夾中一樣。與文件夾不同的是,架構是不能嵌套的,如此而已。因此,架構的好處非常明顯——便於管理。
那么,現在我們來看看用戶和模式(schema,即架構)有什么關系。
通過上面的分析,我們知道,一個架構可以容納多個數據庫對象,但並不是所有的用戶都能訪問某一個架構里的內容的,這就是所謂的權限。看下面一張表:
User1 | User2 | User3 | User4 | |
Schema1 | Y | Y | N | N |
Schema2 | N | Y | N | Y |
Schema3 | Y | N | Y | N |
通過這張表,我們可以看出,用戶1可以訪問架構1和架構3,用戶2可以訪問架構1和架構2,以此類推。
在sql server2000中,用戶和架構是不分離的,到了2005才分離。其實2000中的用戶和架構概念就是為用戶分配固定的模式,即如下表:
User1 | User3 | User3 | |
Schema1 | Y | — | — |
Schema2 | Y | — | |
Schema3 | — | — | Y |
綜合上面所述,用戶和構架的關系是多對多的——一個架構可以對應多個用戶,一個用戶也可以對應多個架構。
現在,我們來討論一下,數據庫(database)和模式(schema)有什么關系。
舉個很淺顯的例子,我們可以把數據庫看作是一個大倉庫,倉庫分了很多很多的房間,Schema就是其中的房間,一個Schema代表一個房間,於是乎,在不同的房間里,我們可以放不同的東西——有的放食物,有的放衣物……而這些不同的東西,就對應着我們數據庫里的對象。
因此,我們可以看到,數據庫與模式時一對多的關系。
總結一下,其實我們的數據庫就是一個數據的大倉庫,而里面創建了很多很多模式,分別放着不同的數據庫對象(包括表),而不同的模式有不同的權限,於是,不同的用戶就有不同的訪問權限來訪問某個模式里的數據庫對象。
參考資料:
http://tech.ddvip.com/2009-01/1231832216105719.html
http://tech.ddvip.com/2009-01/1231832308105720.html
用戶架構分離的好處:
將架構與數據庫用戶分離對管理員和開發人員而言有下列好處:
- 多個用戶可以通過角色成員身份或 Windows 組成員身份擁有一個架構。這擴展了允許角色和組擁有對象的用戶熟悉的功能。
- 極大地簡化了刪除數據庫用戶的操作。
- 刪除數據庫用戶不需要重命名該用戶架構所包含的對象。因而,在刪除創建架構所含對象的用戶后,不再需要修改和測試顯式引用這些對象的應用程序。
- 多個用戶可以共享一個默認架構以進行統一名稱解析。
- 開發人員通過共享默認架構可以將共享對象存儲在為特定應用程序專門創建的架構中,而不是 DBO 架構中。
- 可以用比早期版本中的粒度更大的粒度管理架構和架構包含的對象的權限。