[鐵人賽][Denali 新特性探險25]Contained Databases(3)

[鐵人賽][Denali 新特性探險25]Contained Databases(3)

上一篇我實做了Contained Database轉移到另一台SQL Server Instance過程,

現在你或許也在想是否可以把SQL2008或更低版本的Database轉換成Contained Database?

透過這篇你將了解整個轉換其實相當簡單,但還是須注意幾個小細節。

Note:Contained Database不支援 replication, change data capture, or change tracking。

詳細請參考 Migrate to a Contained Database

 

我先在uncontained database中建立一個登入和相對應使用者 。

 

建立登入和使用者

uncontained database 一般login and user  兩者都會存在關聯

--create login 
 create login noncontainedtest
 with password='aaa123' 
 --create user for noncontainedtest login
 create user noncontaineduser for login noncontainedtest 

 

 

 

查看非內含項目

在轉換之前需先查看資料庫有使用那些非內含項目,

當我們將資料庫的內含項目類型設定為部分時,

這些非內含項目可能會造成轉換失敗或執行問題,我們可以透過 sys.dm_db_uncontained_entities來確認。

select t1.class_desc ,t1.major_id,t1.statement_type,t1.feature_name,t1.feature_type_name     
from sys.dm_db_uncontained_entities t1

image

基本上我們不必擔心 ROUTE ,但這裡需有一個全文檢索索引和一個資料庫主體(因為建立了登入和使用者)非內含項目需留意。

Note:

全文檢索索引:若轉移到另一台SQL Server Instance後找不到全文檢索目錄檔案,

或移動全文檢索檔案位置但沒有指定新位置,

則全文檢索目錄將會處於離線狀態而且您必須在使用全文檢索搜尋之前,

重新建立離線全文檢索目錄。

 

1.設定資料庫內含項目類型=部分

alter database db3 set containment=partial

 

2.SQL Server Login 轉換為SQL user with password

透過以下TSQL先確認有那些啟用驗證的登入名稱

select t1.name,t1.authentication_type_desc 
from sys.database_principals t1 
join sys.server_principals t2 on t1.sid = t2.sid 
where t1.authentication_type = 1  
and t2.is_disabled = 0

image

 

--移除SQL Server Instance和使用者關聯性
exec sp_migrate_user_to_contained @username = N'noncontaineduser ',                                
@rename = N'keep_name',                          
@disable_login = N'disable_login'

image

登入中的noncontainedtest 狀態為disable。

 

3.再次確認登入名稱清單

image

沒有相關資料。

 

4.測試連接Database engine

image

image

連接成功。

 

如果你又想轉換回uncontained database的話,得先確認資料庫使用者類型不能存在sql user with password,

否則當你執行set comtainment= none便會發生如下圖錯誤。

image

 

解決該錯誤請先刪除sql user with password 使用者類型後即可設定成功。

drop user noncontaineduser
alter database db3 set containment= none