在 SQL Server 主機中載入和執行 Managed 程式代碼的能力,需要符合主機對程式代碼存取安全性和主機資源保護的需求。 程式代碼存取安全性需求是由三個 SQL Server 許可權集合之一所指定:SAFE、EXTERNAL-ACCESS 或 UNSAFE。 在 SAFE 或 EXTERNAL-ACCESS 許可權集合內執行的程式代碼必須避免套用屬性 HostProtectionAttribute 的特定類型或成員。 HostProtectionAttribute 與其說是安全性許可權,不如說是可靠性保證,因為它會識別主機可能不允許的特定程式碼構造類型或方法。 使用 HostProtectionAttribute 會強制執行程序設計模型,以協助保護主機的穩定性。
備註
.NET Framework 和 .NET 的所有版本中,代碼存取安全性(CAS)已被棄用。 當使用 CAS 相關 API 時,最新版本的 .NET 不會接受 CAS 註釋,並會產生錯誤。 開發人員應該尋求替代方式來完成安全性工作。
主機保護屬性
主機保護屬性會識別不符合主機程序設計模型的類型或成員,並代表下列增加的可靠性威脅層級:
不是良性。
可能會導致伺服器管理的使用者程式碼不穩定。
可能會導致伺服器處理序本身不穩定。
SQL Server 不允許使用設定 `HostProtectionAttribute` 為 `HostProtectionResource`、`SharedState`、`Synchronization` 或 `MayLeakOnAbort` 的型別或成員。 這可防止組件呼叫可啟用共用狀態、執行同步處理、可能造成終止時資源流失,或影響 SQL Server 程序完整性的成員。
不允許的類型和成員
下表識別 SQL Server 不允許其 HostProtectionResource 值的類型和成員。
SQL Server 許可權集合
SQL Server 可讓使用者指定部署至資料庫之程式代碼的可靠性需求。 將元件上傳至資料庫時,元件的作者可以為該元件指定三個許可權集合之一:SAFE、EXTERNAL-ACCESS 或 UNSAFE。
| 許可權集合 | 安全 | EXTERNAL-ACCESS | 不安全的 |
|---|---|---|---|
| 代碼存取安全性 | 僅限執行 | 執行 + 存取外部資源 | 不受限制 |
| 程序設計模型限制 | 是的 | 是的 | 沒有限制 |
| 可驗證性需求 | 是的 | 是的 | 否 |
| 呼叫原生程式碼的能力 | 否 | 否 | 是的 |
SAFE 是最可靠且安全的模式,並且在允許的程式設計模型方面有相關限制。 SAFE 程式代碼具有高度可靠性和安全性功能。 SAFE 組件有足夠的權限來執行、執行計算,以及存取本機資料庫。 SAFE 組件必須是可驗證的型別安全,且不允許呼叫 Unmanaged 程式碼。
EXTERNAL-ACCESS 提供中繼安全性選項,允許程式代碼存取資料庫外部的資源,但仍具有 SAFE 的可靠性和安全性。
UNSAFE 適用於只能由資料庫管理員建立的高度信任程式碼。 此信任的程式代碼沒有程式代碼存取限制,而且可以呼叫非受控原生程式代碼。
SQL Server 會使用主機層級程式代碼存取安全策略層來設定主機原則,根據儲存在 SQL Server 目錄中的許可權集,授與三組許可權的其中一個。 在資料庫內執行的 Managed 程式碼一律會取得這些程式碼存取權限集合的其中一個。
程式設計模型限制
SQL Server 中的受控代碼程式設計模型需要不依賴於多次調用之間的狀態或多個使用者會話間共享狀態的函數、程序和類型。 此外,如先前所述,共用狀態的存在可能會導致嚴重的例外狀況,影響應用程式的延展性和可靠性。
鑒於這些考慮,SQL Server 不允許使用靜態變數和靜態數據成員。 針對 SAFE 和 EXTERNAL-ACCESS 元件,SQL Server 會在 CREATE ASSEMBLY 時間檢查元件的元數據,如果找到靜態數據成員和變數的使用,則無法建立這類元件。