SQL Server 2012的Contained Database認(rèn)證

SQL Server將認(rèn)證和授權(quán)分散給了不同的對象來完成。SQL Server的登錄名用于認(rèn)證,連接SQL Server的Windows賬號或賬號所在的組必須在SQL Server中有對應(yīng)的登錄名才能成功登錄到SQL Server上。而每個數(shù)據(jù)庫中的用戶被授予了操作數(shù)據(jù)庫中對象的相應(yīng)權(quán)限。登錄名

sql server將認(rèn)證和授權(quán)分散給了不同的對象來完成。sql server的“登錄名”用于認(rèn)證,連接sql server的windows賬號或賬號所在的組必須在sql server中有對應(yīng)的登錄名才能成功登錄到sql server上。而每個中的“用戶”被授予了操作中對象的相應(yīng)權(quán)限。登錄名和用戶之間通過sid聯(lián)系起來。每個登錄名在master數(shù)據(jù)庫中都記錄有該登錄名所對應(yīng)的sid。而在用戶數(shù)據(jù)庫中,用戶名也會和某個sid對應(yīng)起來。通過sid的連接,登錄名被映射到了數(shù)據(jù)庫用戶上,于是登錄sql server的windows賬號也獲得了操作數(shù)據(jù)庫的相應(yīng)權(quán)限。

今天看來這個機制帶來了如下兩個問題:

1. 提高了高可用解決方案的維護成本。舉例來說,對于一個啟用了數(shù)據(jù)庫鏡像的系統(tǒng),如果你在主體上添加了新的登錄名來訪問鏡像數(shù)據(jù)庫的話,你必須在鏡像上也添加相同的登錄名,否則一旦發(fā)生了故障轉(zhuǎn)移,數(shù)據(jù)庫就無法使用新的登錄名進行訪問。另外,在鏡像服務(wù)器上添加登錄名時要確保和主體服務(wù)器上的登錄名使用相同的SID。否則就會破壞登錄名到數(shù)據(jù)庫用戶之間的對應(yīng)關(guān)系,成為所謂的孤立用戶。

2. 增加了遷移應(yīng)用的復(fù)雜程度。應(yīng)用程序所需要的數(shù)據(jù)都保存在用戶數(shù)據(jù)庫中,但是當(dāng)你需要將應(yīng)用從開發(fā)壞境遷移到生產(chǎn)環(huán)境,或者從老的服務(wù)器遷移到新的服務(wù)器上的時候,你不能僅僅簡單的遷移用戶數(shù)據(jù)庫和程序。因為還有一部分和應(yīng)用相關(guān)的數(shù)據(jù)遺漏在用戶數(shù)據(jù)庫之外,其中包括登錄名。在遷移應(yīng)用的時候,登錄名需要被單獨的從老的環(huán)境中提取出來,再部署到新環(huán)境上。

為了解決這樣的問題,SQL Server 2012引入了新的特性,叫做Contained Database認(rèn)證。Contained Database認(rèn)證主要是由兩類對象構(gòu)成整個認(rèn)證體系,一個叫做Contained Database。另一個是創(chuàng)建在Contained Database中的用戶對象,被稱為Contained database user。Contained database,顧名思義,就是將應(yīng)用所需要的所有信息全部“包含”在用戶數(shù)據(jù)庫內(nèi)部,不遺漏在系統(tǒng)數(shù)據(jù)庫中。當(dāng)應(yīng)用程序連接contained database的時候,它不需要通過記錄在master數(shù)據(jù)庫中的登錄名然后再映射到數(shù)據(jù)庫用戶,而是直接在contained database上進行驗證,然后獲得對應(yīng)的contained database user被授予的權(quán)限進行數(shù)據(jù)庫操作。可以說Contained database user就是一個把傳統(tǒng)的登錄名和數(shù)據(jù)庫用戶名的功能揉在一起的一種新的對象類型。有個Contained Database認(rèn)證,上面談到的兩個問題就能很簡單的得到解決。

Contained Database認(rèn)證并不是獨立于傳統(tǒng)的Windows認(rèn)證和SQL認(rèn)證之外的新的認(rèn)證方式,而是建立在這兩種認(rèn)證方式之上的新功能。也就是說,登錄到SQL Server的賬號依舊需要通過Windows認(rèn)證或SQL Server認(rèn)證的機制來驗明正身,只是一旦驗證通過該賬號就會直接被轉(zhuǎn)換成一個數(shù)據(jù)庫用戶。因此你根本不需要在實例中為該賬戶建立任何對應(yīng)的登錄名。

你可以通過以下步驟來啟用Contained Database。

1. 使用SQL Server Management Studio,從實例的屬性中將Enabled Contained Databases選為True。這樣就啟用例了Contained database功能。

2. 你可以創(chuàng)建一個新的Contained Database,也可以將一個現(xiàn)有的數(shù)據(jù)庫更改為Contained database。

(1)????? 要創(chuàng)建一個Contained Database,只需要在創(chuàng)建數(shù)據(jù)庫的對話框中將Containment Type選為Partial。

(2)????? 要將一個數(shù)據(jù)庫更改為Contained database,首先你需要在數(shù)據(jù)庫的屬性頁中將Containment Type改為Partial(類似于創(chuàng)建一個Contained Database)。其次你要將數(shù)據(jù)庫用戶轉(zhuǎn)換為Contained database user,并且需要將數(shù)據(jù)庫用戶對應(yīng)的登錄名都禁用掉。你可以使用一下腳本很方便的禁用這些登錄名

DECLARE @username sysname ;

DECLARE user_cursor CURSOR

??? FOR

? SELECT dp.name

? FROM sys.database_principals AS dp

? JOIN sys.server_principals AS sp

? ON dp.sid = sp.sid

? WHERE dp.authentication_type = 1 AND sp.is_disabled = 0;

OPEN user_cursor

FETCH NEXT FROM user_cursor INTO @username

??? WHILE @@FETCH_STATUS = 0

??? BEGIN

? EXECUTE sp_migrate_user_to_contained

? @username = @username,

? @rename = N’keep_name’,

? @disablelogin = N’disable_login’;

??? FETCH NEXT FROM user_cursor INTO @username

??? END

CLOSE user_cursor ;

DEALLOCATE user_cursor ;

3. 要創(chuàng)建一個Contained database user,你可以通過SQL Server Management Studio來完成。只需要將User type設(shè)置為SQL User this Password或者Windows user即可。

Contained Database除了能夠使得認(rèn)證過程“跳過”登錄名這個對象之外,還帶來了一些其他的好處。比如說,使用了Contained Database,你就不用擔(dān)心數(shù)據(jù)庫的collation和系統(tǒng)數(shù)據(jù)庫的collation不一致的問題了。當(dāng)你對于Contained database進行的SQL操作時,如果產(chǎn)生了臨時表的話,臨時表的collation全部是和Contained database的collation一致,而不是和tempdb一致。另外,Contained database還引入了一個新的概念叫做 Catalog collation,并且所有的Contained database都使用同一種Catalog Collation – Latin1_General_100_CI_AS_WS_KS_SC。這種catalog collation被用于Contained database中各種對象的元數(shù)據(jù),也能帶來很多的便利,這里礙于篇幅就不具體展開了。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊7 分享