權(quán)限兩個字,一個權(quán)力,一個限制。在軟件領(lǐng)域通俗的解釋就是哪些人可以對哪些資源做哪些操作。在SQL Server中,”哪些人”,“哪些資源”,”哪些操作”則分別對應SQL Server中的三個對象,分別為主體(Principals),安全對象(Securables)和權(quán)限(Permissions),而權(quán)力和限制則是對應了SQL Server中的GRENT和DENY。對于主體,安全對象和權(quán)限的初步理解,見下圖:

主體
“主體”是可以請求 SQL Server 資源的實體。主體可以是個體,組或者進程。主體可以按照作用范圍被分為三類:
- Windows級別主體:包括Windows 域登錄名和Windows 本地登錄名。
- 服務器級別主體:包括服務器登錄名和服務器角色。
- 數(shù)據(jù)庫級別主體:包括數(shù)據(jù)庫用戶、數(shù)據(jù)庫角色、固定數(shù)據(jù)庫角色以及應用程序角色。
可以看到主體包括登錄名以及角色。
角色
角色可以看成是權(quán)限的集合體,為了方便權(quán)限管理,可以把一些常用權(quán)限賦予角色,然后再把角色賦予相關(guān)用戶,則這些用戶就繼承了橘色中的所有權(quán)限。一般情況下,數(shù)據(jù)庫會內(nèi)置一些角色,用戶也可以創(chuàng)建自定義角色。對角色進行權(quán)限管理的方式與對用戶進行權(quán)限管理的方式是相同的。
??角色在SQL Server中被分為三類,分別為:
- 內(nèi)置角色----這類角色在服務器安裝時已經(jīng)默認存在,其權(quán)限是固定的,并且不能被刪除
- 用戶自定義角色----這類角色由用戶按照需求自定義創(chuàng)建
- 應用程序角色----這類特殊角色用于管理應用程序的數(shù)據(jù)訪問
角色也分為兩個方面:
- 服務器級別的角色,用于數(shù)據(jù)庫服務器方面的控制權(quán)限
- 數(shù)據(jù)庫級別的角色,用于數(shù)據(jù)庫中數(shù)據(jù)的控制權(quán)限。
(1)服務器級別的角色
服務器級角色的權(quán)限作用域為服務器范圍。例如創(chuàng)建、修改、刪除數(shù)據(jù)庫,管理磁盤文件,添加或刪除數(shù)據(jù)庫連接等等,都是需要服務器上的權(quán)限才能進行操作。
??固定服務器角色具有一組固定的權(quán)限,并且適用于整個服務器范圍。 它們專門用于管理 SQL Server,且不能更改分配給它們的權(quán)限。 可以在數(shù)據(jù)庫中不存在用戶帳戶的情況下向固定服務器角色分配登錄。
??服務器級別的對象,只能包含登錄名。定義了服務器角色,你定義的登陸用戶就有了相應的執(zhí)行權(quán)限。先來看一下服務器級別的固定角色:
| 服務器角色 | 含義 |
|---|---|
| sysadmin | 可以在服務器上執(zhí)行任何活動 |
| serveradmin | 可以更改服務器范圍的配置選項和關(guān)閉服務器 |
| securityadmin | 管理和審核登錄用戶。具有 GRANT、DENY 和 REVOKE 服務器和數(shù)據(jù)庫級別的權(quán)限。此外,還可以重置 SQL Server 登錄名的密碼 |
| processadmin | 管理SQL Server運行的進程 |
| setupadmin | 可以使用 T-SQL 語句添加和刪除連接服務器,并可以執(zhí)行某些系統(tǒng)存儲過程(如 sp_serveroption) |
| bulkadmin | 可以運行 BULK INSERT 語句 |
| diskadmin | 用于管理磁盤文件 |
| dbcreator | 可以創(chuàng)建、更改、刪除和還原任何數(shù)據(jù)庫 |
| public | public角色不同于其它角色在于其權(quán)限可以被修改,每個 SQL Server 登錄名都屬于 public 服務器角色。無法將用戶、角色或組指派給它,因為默認情況下它屬于該角色,且public不能被刪除 |
(2)數(shù)據(jù)庫級別的角色
數(shù)據(jù)庫級角色的權(quán)限作用域為數(shù)據(jù)庫范圍。例如可以訪問哪個數(shù)據(jù)庫,可以訪問哪個數(shù)據(jù)庫中的哪些數(shù)據(jù)表、哪些視圖、哪些存儲過程等等,都需要數(shù)據(jù)庫上的權(quán)限才能進行操作。
??SQL Server存在兩種類型的數(shù)據(jù)庫級角色:數(shù)據(jù)庫中預定義的“固定數(shù)據(jù)庫角色”和可以創(chuàng)建的“用戶定義的數(shù)據(jù)庫角色”。
??固定數(shù)據(jù)庫角色是SQL Server預定義的數(shù)據(jù)庫角色,具有數(shù)據(jù)庫級別的管理權(quán)限,并且存在于每個數(shù)據(jù)庫中。db_owner 數(shù)據(jù)庫角色的成員可以管理固定數(shù)據(jù)庫角色成員身份。自定義數(shù)據(jù)庫角色是當固定數(shù)據(jù)庫角色不能滿足要求時,可以自定義數(shù)據(jù)庫角色。
??數(shù)據(jù)庫級別的對象,只能包含數(shù)據(jù)庫用戶名。先來看一下數(shù)據(jù)庫級別的固定角色:
| 數(shù)據(jù)庫角色 | 含義 |
|---|---|
| db_owner | 可以執(zhí)行數(shù)據(jù)庫中技術(shù)所有動作的用戶,執(zhí)行所有的配置活動和維護活動 |
| db_securityadmin | 管理數(shù)據(jù)庫安全,可以修改角色成員身份和管理權(quán)限。向此角色中添加主體可能會導致意外的權(quán)限升級 |
| db_accessadmin | 可以為 Windows 登錄名、Windows 組和 SQL Server 登錄名添加或刪除數(shù)據(jù)庫訪問權(quán)限 |
| db_backupoperator | 可以備份數(shù)據(jù)庫 |
| db_ddladmin | 可以在數(shù)據(jù)庫中運行任何數(shù)據(jù)定義語言 (DDL) 命令 |
| db_datawriter | 可以在所有用戶表中添加、刪除或更改數(shù)據(jù) |
| db_datareader | 可以從所有用戶表中讀取所有數(shù)據(jù) |
| db_denydatawriter | 不能添加、修改或刪除數(shù)據(jù)庫內(nèi)用戶表中的任何數(shù)據(jù) |
| db_denydatareader | 不能讀取數(shù)據(jù)庫內(nèi)用戶表中的任何數(shù)據(jù) |
| public | public角色不同于其它角色在于其權(quán)限可以被修改,每個數(shù)據(jù)庫用戶、角色或組都屬于public數(shù)據(jù)庫角色。無法將用戶、角色或組指派給它,因為默認情況下它屬于該角色,且public不能被刪除 |
登錄賬號和數(shù)據(jù)庫用戶
SQL Server的服務器和數(shù)據(jù)庫是兩個層次的概念,SQL Server的用戶也分為兩種,一種是服務器登陸賬號,另一種是數(shù)據(jù)庫用戶。
??一個人要操作SQL Server數(shù)據(jù)庫,首先要為其創(chuàng)建服務器登陸賬號,使得他可以登錄到服務器上,然后還要在要操作的數(shù)據(jù)庫上創(chuàng)建和這個登陸賬號對應的數(shù)據(jù)庫用戶。
??可以給登陸賬號賦予相應權(quán)限,使得這個賬號可以執(zhí)行指定的管理服務器的任務。也可以給數(shù)據(jù)庫用戶賦予相應權(quán)限,使得這個數(shù)據(jù)庫用戶可以在這個數(shù)據(jù)庫中執(zhí)行指定的操作。
??服務器登陸賬號分為為Windows驗證及SQL Server驗證兩種。
- Windows身份驗證模式:把Windows的操作系統(tǒng)用戶添加為SQL Server服務器登陸賬號,SQL Server并不參與驗證。SQL Server完全相信Windows的驗證結(jié)果,所以用此方式登錄SQL Server時并不需要提供密碼。
- SQL Server和Windows身份驗證模式:這種模式即允許由Windows來驗證主體身份,又允許SQL Server來驗證主體身份,當由SQL Server驗證主體身份時,需要用戶名和密碼來確認主體身份,和使用什么Windows賬戶半毛錢關(guān)系都沒有,是在服務器上創(chuàng)建的另外一種獨立賬號。
登錄名
??登錄名是服務器級別的主體,但無論是上述哪個層級的主體,因為需要登錄到SQL Server實例,所以每一個層級的主體都需要一個與之對應的登錄名。對于Windows級別的主體來說,Windows用戶會映射到登錄名。對于數(shù)據(jù)庫級別的主體來說,其用戶必須映射到登錄名中。而登錄名可以不映射到數(shù)據(jù)庫用戶,如圖所示登錄名的映射關(guān)系:

??在圖中實例層級的登錄名中,我們看到除了自定義添加的用戶之外,還有一些由系統(tǒng)添加的登錄名。
- 以”##”開頭和結(jié)尾的用戶是SQL Server內(nèi)部使用的賬戶,由證書創(chuàng)建,僅供內(nèi)部系統(tǒng)使用,不應該被刪除。
- sa 登錄名是服務器級的主體。 默認情況下,該登錄名是在安裝實例時創(chuàng)建的。從 SQL Server 2005 開始,sa 的默認數(shù)據(jù)庫為“master”。 sa賬戶可以認為是超級管理員用戶,擁有一切特權(quán),可以在SQL Server中為所欲為,并且不能夠被刪除。因此sa作為分配權(quán)限的起點(也就是SA賬戶在最開始時給予了其他主體對于安全對象的權(quán)限)。因此對于Sa的密碼要設置的盡可能復雜,否則Sa登錄名被盜取后果不堪設想。
- NT AUTHORITY\NETWORK SERVICE和NT AUTHORITY\SYSTEM賬戶是和啟動SQL Server這個Windows服務的賬戶有關(guān),如果使用本地登錄賬戶或是網(wǎng)絡賬戶啟動SQL Server服務,請不要刪除這兩個賬戶。
- BUILDIN\Administrator賬戶是與本地管理員組關(guān)聯(lián)的登錄名,默認屬于sysadmin角色。這個賬戶使得任何屬于本地管理員的賬戶都可以獲得對SQL Server的完全控制權(quán)。
數(shù)據(jù)庫用戶
??數(shù)據(jù)庫用戶是數(shù)據(jù)庫級別的主體,被用于訪問數(shù)據(jù)庫層面的對象。每一個數(shù)據(jù)庫用戶都必須要一個與之對用的登錄名。數(shù)據(jù)庫用戶的信息存在數(shù)據(jù)庫中,而登錄名存在實例級別的Master數(shù)據(jù)庫中(但SQL SERVER2012的Contained Database允許將登錄名也存在數(shù)據(jù)庫級別)。通常來說,數(shù)據(jù)庫層級的用戶可以和映射的登錄名不一致,但由于這種做法會引起混淆,因此并不推薦,如下圖所示。

??默認情況下,每個數(shù)據(jù)庫都帶有4個內(nèi)置用戶,如下圖所示:

- dbo用戶:dbo用戶是Database Owner的簡稱,如果說SA是實例級別的老大,那DBO就是數(shù)據(jù)庫級別的老大,是數(shù)據(jù)庫的擁有者。這個用戶也同樣不能被刪除,登錄名sa自動映射為數(shù)據(jù)庫用戶dbo。每一個表創(chuàng)建時如果沒有指定Schema,則默認在dbo這個schema下。
- guest 用戶:guest用戶是一個來賓賬戶,這個賬戶允許登錄名沒有映射到數(shù)據(jù)庫用戶的情況下訪問數(shù)據(jù)庫。默認情況下guest用戶是不啟用的,但不能刪除??赏ㄟ^撤消該用戶的 CONNECT 權(quán)限將其禁用。
--允許guest用戶連接權(quán)限
GRANT CONNECT TO guest
--收回guest的連接權(quán)限
REVOKE CONNECT TO guest
-
INFORMATION_SCHEMA 和 sys:它們都作為用戶出現(xiàn)在目錄視圖中。 這兩個實體是 SQL Server 所必需的。 它們不是主體,不能修改或刪除它們。
安全對象
安全對象是SQL Server數(shù)據(jù)庫引擎授權(quán)系統(tǒng)控制對其訪問的資源。安全對象分別屬于3個層次:服務器、數(shù)據(jù)庫、架構(gòu)。
??不同的范圍包含不同的安全對象,詳見下圖。

架構(gòu)(schema)及其管理
在SQL Server 2000中的構(gòu)架是和用戶綁定的,比如我新建用戶Jack,SQL Server自動分配一個叫Jack構(gòu)架,用戶Jack并不能改變這個選項,而由Jack所建的任何對象都在Jack之下。比如新建一個表,則為Jack.Table1。當Jack如果離職時,這對管理來說簡直是一場噩夢。
??從SQL Server2005開始,數(shù)據(jù)庫用戶不再等同于架構(gòu),允許用戶和構(gòu)架分離。而在Oracle中,用戶與模式還是等同的(在Oracle中,schema一般翻譯為模式)。所以以往 SQL Server 內(nèi)的對象命名是“服務器.數(shù)據(jù)庫.用戶名.對象”,但如今的對象命名改為“服務器.數(shù)據(jù)庫.Schema.對象”
??架構(gòu)是與創(chuàng)建它的數(shù)據(jù)庫用戶無關(guān)的命名空間,也可以說,架構(gòu)是數(shù)據(jù)庫對象的容器,獨立于創(chuàng)建它們的數(shù)據(jù)庫用戶而存在。架構(gòu)有一下特點:
- 多個數(shù)據(jù)庫用戶可以共享一個默認的架構(gòu);
- 單個架構(gòu)可以包含多個數(shù)據(jù)庫用戶擁有的對象;
- 架構(gòu)的所有權(quán)和架構(gòu)內(nèi)的安全對象可以轉(zhuǎn)移;
- 對象可以在不同的架構(gòu)之間移動;
- 可以刪除數(shù)據(jù)庫用戶,而不刪除相應架構(gòu)中的對象。
架構(gòu)所有者和權(quán)限
??通過用戶架構(gòu)分離,可實現(xiàn)管理數(shù)據(jù)庫對象權(quán)限的更大靈活性。,因為對象不再綁定到用戶賬號上,所以你根本不用擔心當一個賬號被刪除時需要變換對象的擁有者。
??默認情況下,當開發(fā)人員創(chuàng)建了一個對象時,該對象并不屬于開發(fā)人員而屬于一個數(shù)據(jù)庫架構(gòu)。
??任何數(shù)據(jù)庫主體都可以擁有架構(gòu),并且一個主體可擁有多個架構(gòu)。每個架構(gòu)都有其所有者,但是所有者和架構(gòu)名是不綁定的。所以當一個用戶擁有一個架構(gòu),并且這個用戶必須從數(shù)據(jù)庫中刪除時,可以不用破壞任何代碼而僅僅是將架構(gòu)的所有者變一下。
??可以對架構(gòu)應用安全規(guī)則,安全規(guī)則將由架構(gòu)中的所有對象繼承。 如果設置了對架構(gòu)的訪問權(quán)限,則當新對象添加到架構(gòu)時,新對象會自動應用這些權(quán)限。注意:用戶不從架構(gòu)繼承權(quán)限,架構(gòu)權(quán)限由架構(gòu)中包含的數(shù)據(jù)庫對象繼承。
內(nèi)置架構(gòu)
??SQL Server創(chuàng)建了十個預定義的架構(gòu),它們與內(nèi)置數(shù)據(jù)庫用戶和角色具有相同的名稱。這些架構(gòu)主要用于向后兼容性。如果您不需要與固定數(shù)據(jù)庫角色具有相同名稱的架構(gòu),則可以刪除它們。您不能刪除下列架構(gòu):
- dbo:dbo 是新創(chuàng)建的數(shù)據(jù)庫的默認架構(gòu)。 dbo 架構(gòu)由 dbo 用戶帳戶擁有。 默認情況下,使用 CREATE USER命令創(chuàng)建的用戶的默認架構(gòu)為 dbo,但是分配了 dbo 架構(gòu)的用戶不繼承 dbo 用戶帳戶的權(quán)限。
- guest
- sys:為系統(tǒng)對象而保留的。
-
INFORMATION_SCHEMA:為系統(tǒng)對象而保留的。
如果從模型數(shù)據(jù)庫中刪除這些架構(gòu),它們將不會顯示在新數(shù)據(jù)庫中。
