這篇介紹如何將非Contained Database轉換為Contained Database。
上一篇我實做了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
基本上我們不必擔心 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
移除相關SQL Server Instance和使用者關聯性
--移除SQL Server Instance和使用者關聯性
exec sp_migrate_user_to_contained @username = N'noncontaineduser ',
@rename = N'keep_name',
@disable_login = N'disable_login'
執行後可以看到登入中的noncontainedtest 狀態為disable。
3.再次確認登入名稱清單
沒有相關資料。
4.測試連接Database engine
連接成功。
如果你又想轉換回uncontained database的話,
得先確認資料庫使用者類型不能存在sql user with password,
否則當你執行set comtainment= none便會發生如下圖錯誤。
解決該錯誤請先刪除sql user with password 使用者類型後即可設定成功。
drop user noncontaineduser
alter database db3 set containment= none
MS SQL Server新特性探險:探險代碼 Denali 全系列文章