權(quán)限兩個字碗殷,一個權(quán)力,一個限制桑阶。在軟件領(lǐng)域通俗的解釋就是哪些人可以對哪些資源做哪些操作霜运。在SQL Server中,”哪些人”刻蟹,“哪些資源”,”哪些操作”則分別對應(yīng)SQL Server中的三個對象逗旁,分別為主體(Principals),安全對象(Securables)和權(quán)限(Permissions),而權(quán)力和限制則是對應(yīng)了SQL Server中的GRENT和DENY。對于主體片效,安全對象和權(quán)限的初步理解红伦,見下圖:
主體
“主體”是可以請求 SQL Server 資源的實體。主體可以是個體淀衣,組或者進(jìn)程昙读。主體可以按照作用范圍被分為三類:
- Windows級別主體:包括Windows 域登錄名和Windows 本地登錄名。
- 服務(wù)器級別主體:包括服務(wù)器登錄名和服務(wù)器角色膨桥。
- 數(shù)據(jù)庫級別主體:包括數(shù)據(jù)庫用戶蛮浑、數(shù)據(jù)庫角色、固定數(shù)據(jù)庫角色以及應(yīng)用程序角色只嚣。
可以看到主體包括登錄名以及角色沮稚。
角色
角色可以看成是權(quán)限的集合體,為了方便權(quán)限管理册舞,可以把一些常用權(quán)限賦予角色蕴掏,然后再把角色賦予相關(guān)用戶,則這些用戶就繼承了橘色中的所有權(quán)限调鲸。一般情況下盛杰,數(shù)據(jù)庫會內(nèi)置一些角色,用戶也可以創(chuàng)建自定義角色藐石。對角色進(jìn)行權(quán)限管理的方式與對用戶進(jìn)行權(quán)限管理的方式是相同的即供。
??角色在SQL Server中被分為三類,分別為:
- 內(nèi)置角色----這類角色在服務(wù)器安裝時已經(jīng)默認(rèn)存在贯钩,其權(quán)限是固定的募狂,并且不能被刪除
- 用戶自定義角色----這類角色由用戶按照需求自定義創(chuàng)建
- 應(yīng)用程序角色----這類特殊角色用于管理應(yīng)用程序的數(shù)據(jù)訪問
角色也分為兩個方面:
- 服務(wù)器級別的角色办素,用于數(shù)據(jù)庫服務(wù)器方面的控制權(quán)限
- 數(shù)據(jù)庫級別的角色角雷,用于數(shù)據(jù)庫中數(shù)據(jù)的控制權(quán)限。
(1)服務(wù)器級別的角色
服務(wù)器級角色的權(quán)限作用域為服務(wù)器范圍性穿。例如創(chuàng)建勺三、修改、刪除數(shù)據(jù)庫需曾,管理磁盤文件吗坚,添加或刪除數(shù)據(jù)庫連接等等,都是需要服務(wù)器上的權(quán)限才能進(jìn)行操作呆万。
??固定服務(wù)器角色具有一組固定的權(quán)限商源,并且適用于整個服務(wù)器范圍。 它們專門用于管理 SQL Server谋减,且不能更改分配給它們的權(quán)限牡彻。 可以在數(shù)據(jù)庫中不存在用戶帳戶的情況下向固定服務(wù)器角色分配登錄。
??服務(wù)器級別的對象出爹,只能包含登錄名庄吼。定義了服務(wù)器角色缎除,你定義的登陸用戶就有了相應(yīng)的執(zhí)行權(quán)限。先來看一下服務(wù)器級別的固定角色:
服務(wù)器角色 | 含義 |
---|---|
sysadmin | 可以在服務(wù)器上執(zhí)行任何活動 |
serveradmin | 可以更改服務(wù)器范圍的配置選項和關(guān)閉服務(wù)器 |
securityadmin | 管理和審核登錄用戶总寻。具有 GRANT器罐、DENY 和 REVOKE 服務(wù)器和數(shù)據(jù)庫級別的權(quán)限。此外渐行,還可以重置 SQL Server 登錄名的密碼 |
processadmin | 管理SQL Server運(yùn)行的進(jìn)程 |
setupadmin | 可以使用 T-SQL 語句添加和刪除連接服務(wù)器轰坊,并可以執(zhí)行某些系統(tǒng)存儲過程(如 sp_serveroption) |
bulkadmin | 可以運(yùn)行 BULK INSERT 語句 |
diskadmin | 用于管理磁盤文件 |
dbcreator | 可以創(chuàng)建、更改祟印、刪除和還原任何數(shù)據(jù)庫 |
public | public角色不同于其它角色在于其權(quán)限可以被修改衰倦,每個 SQL Server 登錄名都屬于 public 服務(wù)器角色。無法將用戶旁理、角色或組指派給它樊零,因為默認(rèn)情況下它屬于該角色,且public不能被刪除 |
(2)數(shù)據(jù)庫級別的角色
數(shù)據(jù)庫級角色的權(quán)限作用域為數(shù)據(jù)庫范圍孽文。例如可以訪問哪個數(shù)據(jù)庫驻襟,可以訪問哪個數(shù)據(jù)庫中的哪些數(shù)據(jù)表、哪些視圖芋哭、哪些存儲過程等等沉衣,都需要數(shù)據(jù)庫上的權(quán)限才能進(jìn)行操作。
??SQL Server存在兩種類型的數(shù)據(jù)庫級角色:數(shù)據(jù)庫中預(yù)定義的“固定數(shù)據(jù)庫角色”和可以創(chuàng)建的“用戶定義的數(shù)據(jù)庫角色”减牺。
??固定數(shù)據(jù)庫角色是SQL Server預(yù)定義的數(shù)據(jù)庫角色豌习,具有數(shù)據(jù)庫級別的管理權(quán)限,并且存在于每個數(shù)據(jù)庫中拔疚。db_owner 數(shù)據(jù)庫角色的成員可以管理固定數(shù)據(jù)庫角色成員身份肥隆。自定義數(shù)據(jù)庫角色是當(dāng)固定數(shù)據(jù)庫角色不能滿足要求時,可以自定義數(shù)據(jù)庫角色稚失。
??數(shù)據(jù)庫級別的對象栋艳,只能包含數(shù)據(jù)庫用戶名。先來看一下數(shù)據(jù)庫級別的固定角色:
數(shù)據(jù)庫角色 | 含義 |
---|---|
db_owner | 可以執(zhí)行數(shù)據(jù)庫中技術(shù)所有動作的用戶句各,執(zhí)行所有的配置活動和維護(hù)活動 |
db_securityadmin | 管理數(shù)據(jù)庫安全吸占,可以修改角色成員身份和管理權(quán)限。向此角色中添加主體可能會導(dǎo)致意外的權(quán)限升級 |
db_accessadmin | 可以為 Windows 登錄名凿宾、Windows 組和 SQL Server 登錄名添加或刪除數(shù)據(jù)庫訪問權(quán)限 |
db_backupoperator | 可以備份數(shù)據(jù)庫 |
db_ddladmin | 可以在數(shù)據(jù)庫中運(yùn)行任何數(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ù)庫角色。無法將用戶、角色或組指派給它骤坐,因為默認(rèn)情況下它屬于該角色绪杏,且public不能被刪除 |
登錄賬號和數(shù)據(jù)庫用戶
SQL Server的服務(wù)器和數(shù)據(jù)庫是兩個層次的概念,SQL Server的用戶也分為兩種纽绍,一種是服務(wù)器登陸賬號蕾久,另一種是數(shù)據(jù)庫用戶。
??一個人要操作SQL Server數(shù)據(jù)庫拌夏,首先要為其創(chuàng)建服務(wù)器登陸賬號僧著,使得他可以登錄到服務(wù)器上,然后還要在要操作的數(shù)據(jù)庫上創(chuàng)建和這個登陸賬號對應(yīng)的數(shù)據(jù)庫用戶障簿。
??可以給登陸賬號賦予相應(yīng)權(quán)限盹愚,使得這個賬號可以執(zhí)行指定的管理服務(wù)器的任務(wù)。也可以給數(shù)據(jù)庫用戶賦予相應(yīng)權(quán)限站故,使得這個數(shù)據(jù)庫用戶可以在這個數(shù)據(jù)庫中執(zhí)行指定的操作皆怕。
??服務(wù)器登陸賬號分為為Windows驗證及SQL Server驗證兩種。
- Windows身份驗證模式:把Windows的操作系統(tǒng)用戶添加為SQL Server服務(wù)器登陸賬號西篓,SQL Server并不參與驗證愈腾。SQL Server完全相信Windows的驗證結(jié)果,所以用此方式登錄SQL Server時并不需要提供密碼岂津。
- SQL Server和Windows身份驗證模式:這種模式即允許由Windows來驗證主體身份虱黄,又允許SQL Server來驗證主體身份,當(dāng)由SQL Server驗證主體身份時吮成,需要用戶名和密碼來確認(rèn)主體身份橱乱,和使用什么Windows賬戶半毛錢關(guān)系都沒有,是在服務(wù)器上創(chuàng)建的另外一種獨(dú)立賬號粱甫。
登錄名
??登錄名是服務(wù)器級別的主體泳叠,但無論是上述哪個層級的主體,因為需要登錄到SQL Server實例魔种,所以每一個層級的主體都需要一個與之對應(yīng)的登錄名析二。對于Windows級別的主體來說粉洼,Windows用戶會映射到登錄名节预。對于數(shù)據(jù)庫級別的主體來說,其用戶必須映射到登錄名中属韧。而登錄名可以不映射到數(shù)據(jù)庫用戶安拟,如圖所示登錄名的映射關(guān)系:
??在圖中實例層級的登錄名中,我們看到除了自定義添加的用戶之外宵喂,還有一些由系統(tǒng)添加的登錄名糠赦。
- 以”##”開頭和結(jié)尾的用戶是SQL Server內(nèi)部使用的賬戶,由證書創(chuàng)建,僅供內(nèi)部系統(tǒng)使用拙泽,不應(yīng)該被刪除淌山。
- sa 登錄名是服務(wù)器級的主體。 默認(rèn)情況下顾瞻,該登錄名是在安裝實例時創(chuàng)建的泼疑。從 SQL Server 2005 開始,sa 的默認(rèn)數(shù)據(jù)庫為“master”荷荤。 sa賬戶可以認(rèn)為是超級管理員用戶退渗,擁有一切特權(quán),可以在SQL Server中為所欲為蕴纳,并且不能夠被刪除会油。因此sa作為分配權(quán)限的起點(也就是SA賬戶在最開始時給予了其他主體對于安全對象的權(quán)限)。因此對于Sa的密碼要設(shè)置的盡可能復(fù)雜古毛,否則Sa登錄名被盜取后果不堪設(shè)想翻翩。
- NT AUTHORITY\NETWORK SERVICE和NT AUTHORITY\SYSTEM賬戶是和啟動SQL Server這個Windows服務(wù)的賬戶有關(guān),如果使用本地登錄賬戶或是網(wǎng)絡(luò)賬戶啟動SQL Server服務(wù)稻薇,請不要刪除這兩個賬戶体斩。
- BUILDIN\Administrator賬戶是與本地管理員組關(guān)聯(lián)的登錄名,默認(rè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ù)庫層級的用戶可以和映射的登錄名不一致伴嗡,但由于這種做法會引起混淆,因此并不推薦从铲,如下圖所示瘪校。
??默認(rèn)情況下,每個數(shù)據(jù)庫都帶有4個內(nèi)置用戶名段,如下圖所示:
- dbo用戶:dbo用戶是Database Owner的簡稱阱扬,如果說SA是實例級別的老大,那DBO就是數(shù)據(jù)庫級別的老大伸辟,是數(shù)據(jù)庫的擁有者麻惶。這個用戶也同樣不能被刪除,登錄名sa自動映射為數(shù)據(jù)庫用戶dbo信夫。每一個表創(chuàng)建時如果沒有指定Schema窃蹋,則默認(rèn)在dbo這個schema下卡啰。
- guest 用戶:guest用戶是一個來賓賬戶,這個賬戶允許登錄名沒有映射到數(shù)據(jù)庫用戶的情況下訪問數(shù)據(jù)庫警没。默認(rèn)情況下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個層次:服務(wù)器及穗、數(shù)據(jù)庫、架構(gòu)绵载。
??不同的范圍包含不同的安全對象埂陆,詳見下圖。
架構(gòu)(schema)及其管理
在SQL Server 2000中的構(gòu)架是和用戶綁定的娃豹,比如我新建用戶Jack焚虱,SQL Server自動分配一個叫Jack構(gòu)架,用戶Jack并不能改變這個選項懂版,而由Jack所建的任何對象都在Jack之下鹃栽。比如新建一個表,則為Jack.Table1躯畴。當(dāng)Jack如果離職時民鼓,這對管理來說簡直是一場噩夢。
??從SQL Server2005開始蓬抄,數(shù)據(jù)庫用戶不再等同于架構(gòu)丰嘉,允許用戶和構(gòu)架分離。而在Oracle中嚷缭,用戶與模式還是等同的(在Oracle中饮亏,schema一般翻譯為模式)。所以以往 SQL Server 內(nèi)的對象命名是“服務(wù)器.數(shù)據(jù)庫.用戶名.對象”阅爽,但如今的對象命名改為“服務(wù)器.數(shù)據(jù)庫.Schema.對象”
??架構(gòu)是與創(chuàng)建它的數(shù)據(jù)庫用戶無關(guān)的命名空間路幸,也可以說,架構(gòu)是數(shù)據(jù)庫對象的容器优床,獨(dú)立于創(chuàng)建它們的數(shù)據(jù)庫用戶而存在劝赔。架構(gòu)有一下特點:
- 多個數(shù)據(jù)庫用戶可以共享一個默認(rèn)的架構(gòu);
- 單個架構(gòu)可以包含多個數(shù)據(jù)庫用戶擁有的對象胆敞;
- 架構(gòu)的所有權(quán)和架構(gòu)內(nèi)的安全對象可以轉(zhuǎn)移着帽;
- 對象可以在不同的架構(gòu)之間移動;
- 可以刪除數(shù)據(jù)庫用戶移层,而不刪除相應(yīng)架構(gòu)中的對象仍翰。
架構(gòu)所有者和權(quán)限
??通過用戶架構(gòu)分離,可實現(xiàn)管理數(shù)據(jù)庫對象權(quán)限的更大靈活性观话。予借,因為對象不再綁定到用戶賬號上,所以你根本不用擔(dān)心當(dāng)一個賬號被刪除時需要變換對象的擁有者频蛔。
??默認(rèn)情況下灵迫,當(dāng)開發(fā)人員創(chuàng)建了一個對象時,該對象并不屬于開發(fā)人員而屬于一個數(shù)據(jù)庫架構(gòu)晦溪。
??任何數(shù)據(jù)庫主體都可以擁有架構(gòu)瀑粥,并且一個主體可擁有多個架構(gòu)。每個架構(gòu)都有其所有者三圆,但是所有者和架構(gòu)名是不綁定的狞换。所以當(dāng)一個用戶擁有一個架構(gòu),并且這個用戶必須從數(shù)據(jù)庫中刪除時舟肉,可以不用破壞任何代碼而僅僅是將架構(gòu)的所有者變一下修噪。
??可以對架構(gòu)應(yīng)用安全規(guī)則,安全規(guī)則將由架構(gòu)中的所有對象繼承路媚。 如果設(shè)置了對架構(gòu)的訪問權(quán)限黄琼,則當(dāng)新對象添加到架構(gòu)時,新對象會自動應(yīng)用這些權(quán)限整慎。注意:用戶不從架構(gòu)繼承權(quán)限适荣,架構(gòu)權(quán)限由架構(gòu)中包含的數(shù)據(jù)庫對象繼承。
內(nèi)置架構(gòu)
??SQL Server創(chuàng)建了十個預(yù)定義的架構(gòu)院领,它們與內(nèi)置數(shù)據(jù)庫用戶和角色具有相同的名稱弛矛。這些架構(gòu)主要用于向后兼容性。如果您不需要與固定數(shù)據(jù)庫角色具有相同名稱的架構(gòu)比然,則可以刪除它們丈氓。您不能刪除下列架構(gòu):
- dbo:dbo 是新創(chuàng)建的數(shù)據(jù)庫的默認(rèn)架構(gòu)。 dbo 架構(gòu)由 dbo 用戶帳戶擁有强法。 默認(rèn)情況下万俗,使用 CREATE USER命令創(chuàng)建的用戶的默認(rèn)架構(gòu)為 dbo,但是分配了 dbo 架構(gòu)的用戶不繼承 dbo 用戶帳戶的權(quán)限饮怯。
- guest
- sys:為系統(tǒng)對象而保留的闰歪。
-
INFORMATION_SCHEMA:為系統(tǒng)對象而保留的。
如果從模型數(shù)據(jù)庫中刪除這些架構(gòu)蓖墅,它們將不會顯示在新數(shù)據(jù)庫中库倘。