封裝資料庫是一種資料庫,它與其他資料庫以及裝載該資料庫的 SQL Server 實例隔離。 SQL Server 2014 可協助使用者以 4 種方式將其資料庫與實例隔離。
描述資料庫的大部分元數據都是在資料庫中維護的。 (除了在主資料庫中維護元數據之外,也可以選擇不維護。)
所有元數據都會使用相同的定序來定義。
使用者驗證可由資料庫執行,減少資料庫對 SQL Server 實例登入的相依性。
SQL Server 環境(例如 DMV、XEvents 等)能報告並處理包含資訊。
部分自主資料庫的某些功能,例如將元數據儲存在資料庫中,會套用至所有 SQL Server 2014 資料庫。 有些部分受限資料庫的優點,例如資料庫層級的身份驗證和編錄整理,必須先啟用才能使用。 部分容器功能是透過使用 CREATE DATABASE 和 ALTER DATABASE 語句或使用 SQL Server Management Studio 來啟用。 如需如何啟用部分資料庫自包含的詳細資訊,請參閱 移轉至部分自包含資料庫。
本主題包含下列各節。
部分封裝的資料庫概念
完整自主資料庫包含定義資料庫所需的所有設定和元數據,而且與安裝資料庫的 SQL Server Database Engine 實例沒有組態相依性。 在舊版的 SQL Server 中,將資料庫與 SQL Server 實例分開可能相當耗時,而且需要深入了解資料庫與 SQL Server 實例之間的關聯性。 部分自主資料庫可讓您更輕鬆地將資料庫與 SQL Server 和其他資料庫的實例分開。
被包含的資料庫會考慮有關包容性的功能。 任何僅依賴於資料庫中函式的使用者定義實體,都被視為完全封閉。 任何依賴資料庫外部函式的使用者定義實體,都會被視為不受影響。 (如需詳細資訊,請參閱本主題後面的 封鎖 部分。
下列條款適用於所包含的資料庫模型。
資料庫界限
資料庫與 SQL Server 實例之間的界限。 資料庫與其他資料庫之間的界限。
受限
完全存在於資料庫界限中的專案。
未受控
超越資料庫界限的元素。
非自主資料庫
已將內含項目設定為 NONE的資料庫。 SQL Server 2012 之前版本中的所有資料庫都是非自主資料庫。 根據預設,所有 SQL Server 2012 及更高版本的資料庫都將封裝設定為 NONE。
部分受控資料庫
部分封閉的資料庫是一種封閉的資料庫,它可以允許某些功能跨越資料庫界限。 SQL Server 包含判斷內含專案界限何時越過的能力。
受限制的使用者
封裝資料庫有兩種類型的使用者。
具有密碼的受限資料庫使用者
包含在資料庫中的使用者會由資料庫透過密碼進行驗證。
Windows 主體
授權的 Windows 使用者和已授權 Windows 群組的成員可以直接連線到資料庫,而且不需要 master 資料庫中的登入。 資料庫會信任 Windows 的驗證。
根據在 master 資料庫中登入的使用者可以被授予封閉式資料庫的存取權,但這會對 SQL Server 實例產生依賴。 因此,根據登入建立使用者,請參閱部分自主資料庫的批注。
這很重要
若啟用部分自主資料庫,會將 SQL Server 執行個體的存取控制權委派給資料庫擁有者。 如需詳細資訊,請參閱 Security Best Practices with Contained Databases。
資料庫界限
由於部分自主資料庫會將資料庫功能與 實例的功能區隔開,因此這兩個元素之間有一條清楚定義的線,稱為 資料庫界限。
資料庫界限內部是 資料庫模型,其中會開發及管理資料庫。 位於資料庫內部的實體範例包括 、sys.tables 等系統數據表、具有密碼的自主資料庫使用者,以及目前資料庫中以兩部分名稱參考的用戶數據表。
資料庫界限外部是與實例層級函式和管理相關的 管理模型。 位於資料庫界限外部的實體範例包括:系統數據表(如 sys.endpoints)、映射到登入的使用者,以及在另一個資料庫中,透過三段式名稱參考的使用者資料表。
封鎖
在資料庫中完全存在的用戶實體被視為封閉。 任何位於資料庫外部或依賴與資料庫外部函式互動的實體,都會被視為 不受影響。
一般而言,用戶實體歸屬於以下範疇的包含類別:
完整包含的使用者實體(從未跨越資料庫界線的使用者實體),例如 sys.indexes。 任何使用這些功能的程式代碼或任何只參考這些實體的物件,也會完全包含。
未受控制的用戶實體(跨越資料庫界限的用戶實體),例如sys.server_principals或伺服器主體(登入)本身。 任何使用這些實體的程式代碼,或任何參考這些實體的函式皆未受遏制。
部分受限資料庫
目前受限式資料庫功能僅適用於部份包含狀態。 部分自主資料庫是一個自主資料庫,允許使用未受控制的功能。
使用 sys.dm_db_uncontained_entities 和 sys.sql_modules (Transact-SQL) 檢視可傳回未受控制的物件或功能的相關信息。 藉由判斷資料庫元素的封裝狀態,您可以探索哪些物件或功能必須被取代或更改,以促進封裝。
這很重要
由於某些物件有預設的內含項目設定為NONE,因此此檢視可能顯示錯誤的結果。
部分自主資料庫的行為與非自主資料庫在定序方面的行為大相徑庭。 如需定序問題的詳細資訊,請參閱 包含的資料庫排序。
使用部分封裝資料庫的優點
透過使用部分隔離的資料庫,可以解決與非隔離資料庫相關聯的問題和複雜性。
資料庫移動
移動資料庫時發生的其中一個問題是,當資料庫從某個實例移至另一個實例時,無法使用某些重要資訊。 例如,登入資訊會儲存在 實例內,而不是儲存在資料庫中。 當您將非自主資料庫從一個實例移至另一個SQL Server 實例時,這項資訊會留下。 您必須識別遺漏的資訊,並將它與您的資料庫移至新的SQL Server 實例。 此過程可能會很困難,而且耗時。
部分包含的資料庫可以將重要資訊儲存在資料庫中,確保資料庫在移動後依然保留資訊。
備註
部分封閉的資料庫可以提供文件,描述無法與實例分開的資料庫所使用的功能。 這包括其他相互關聯的資料庫清單和資料庫所需但無法自行包含的系統設定等。
使用AlwaysOn的受限資料庫使用者的權益
藉由減少與 SQL Server 實例的系結,當您使用 Always On 可用性群組時,部分包含的資料庫在故障移轉期間很有用。
建立自主使用者可讓使用者直接連線到自主資料庫。 這是高可用性和災害復原案例中非常重要的功能,例如 AlwaysOn 解決方案。 如果使用者是封閉的使用者,如果發生故障轉移,人們就能夠連線到次要伺服器,而不需要在次要伺服器上建立登錄資訊。 這提供立即的好處。 如需詳細資訊,請參閱 AlwaysOn 可用性群組概觀(SQL Server)和 AlwaysOn 可用性群組的必要條件、限制和建議(SQL Server)。
初始資料庫開發
因為開發人員可能不知道要部署新資料庫的位置,因此限制對資料庫所部署的環境影響會降低開發人員的工作和顧慮。 在非自主模型中,開發人員必須據以考慮對新資料庫和程式的可能環境影響。 不過,開發人員可以使用部分容納的資料庫來偵測資料庫的實例層級影響以及開發人員的實例層級關注。
資料庫管理
在資料庫中維護資料庫設定,而不是在 master 資料庫中,讓每個資料庫擁有者都能更充分掌控其資料庫,而不需要授與資料庫擁有者 系統管理員 許可權。
局限性
受限資料庫不支援以下功能。
部分包含資料庫無法使用複製、資料擷取或變更追蹤。
編號步驟
相依於具有定序變更之內建函式的架構系結物件
定序變更所產生的系結變更,包括對象、數據行、符號或類型的參考。
複寫、變更數據擷取及變更追蹤。
警告
目前允許暫存儲存程序。 由於臨時儲存程序破壞了封閉性,因此未來版本的包含式資料庫預計將不支援這些儲存程序。
識別資料庫包含性
有兩個工具可協助識別資料庫的內含項目狀態。 sys.dm_db_uncontained_entities (Transact-SQL) 是一種檢視,顯示資料庫中所有可能未受控制的實體。 當在運行時識別出任何實際未包含的實體時,database_uncontained_usage事件就會發生。
sys.dm_db_uncontained_entities
此檢視會顯示資料庫中可能未受限制的任何實體,例如跨資料庫界限的實體。 這包括可能使用資料庫模型外部對象的用戶實體。 不過,由於某些實體的封裝(例如,使用動態 SQL 的實體只能在執行時才能確定),因此檢視可能會顯示某些實際上不包含其中的實體。 如需詳細資訊,請參閱 sys.dm_db_uncontained_entities (Transact-SQL) 。
資料庫非包容性使用事件
每當在運行時間識別未受控制的實體時,就會發生此 XEvent。 這包括源自用戶端程式代碼的實體。 此 XEvent 只會針對實際未受控制的實體發生。 不過,事件只會在運行時間發生。 因此,此 XEvent 不會識別您未執行的任何未受控制的用戶實體