SQL Server 程式設計和主機保護屬性
在 SQL Server 主應用程式中載入及執行 Managed 程式碼的能力,需要符合主應用程式對於程式碼存取安全性和主應用程式資源保護的需求。 程式碼存取安全性的需求是由下列三個 SQL Server 使用權限集合的其中一個所指定:SAFE、EXTERNAL-ACCESS 或 UNSAFE。 在 SAFE 或 EXTERNAL-ACCESS 使用權限集合內執行的程式碼,必須避免某些已套用 HostProtectionAttribute 屬性的型別或成員。 HostProtectionAttribute 並不是和可靠性保證同等的安全性權限,因為它會識別主應用程式可能不允許的特定程式碼建構 (型別或方法)。 使用 HostProtectionAttribute 會強制使用有助於保護主應用程式之穩定性的程式設計模型。
主應用程式保護屬性
主應用程式保護屬性可識別不適合主應用程式設計模型以及表示下列可靠性威脅等級提高的型別或成員:
否則為良性。
可能會導致受伺服器管理之使用者程式碼不穩定。
可能會導致伺服器處理序本身的不穩定。
SQL Server 不允許使用具有 HostProtectionAttribute (會指定 SharedState、Synchronization、MayLeakOnAbort 或 ExternalProcessMgmt 的 HostProtectionResource 值) 的型別或成員。 這會讓組件無法呼叫啟用共用狀態、執行同步處理、在終止時可能造成資源流失、或是會影響 SQL Server 處理序完整性的成員。
不允許的型別和成員
下表將識別一些型別和成員,SQL Server 不允許使用它們的 HostProtectionResource 值。
SQL Server 使用權限集合
SQL Server 可讓使用者針對部署到資料庫中的程式碼指定可靠性需求。 當組件上載到資料庫中時,組件的作者可以為該組件指定以下三個使用權限集合當中的一個:SAFE、EXTERNAL-ACCESS 或 UNSAFE。
使用權限集合 |
SAFE |
EXTERNAL-ACCESS |
UNSAFE |
---|---|---|---|
程式碼存取安全性 |
僅限執行 |
執行 + 存取外部資源 |
不受限 |
程式設計模型限制 |
是 |
是 |
無限制 |
可驗證性需求 |
是 |
是 |
否 |
呼叫機器碼的能力 |
否 |
否 |
是 |
SAFE 是最可靠及安全的模式,其包含了根據允許的程式設計模型的相關限制。 SAFE 程式碼具有高可靠性和安全性功能; SAFE 組件有被授與足夠的權限來執行、進行運算,以及存取本機資料庫。 SAFE 組件需要是可驗證的型別安全組件,且不允許呼叫 Unmanaged 程式碼。
EXTERNAL-ACCESS 提供了中級安全性選項,可讓程式碼存取在資料庫外部的資源,但是仍然保有 SAFE 的可靠性和安全性。
UNSAFE 適用於高度信任的程式碼,這類程式碼只能由資料庫管理員建立; 此信任的程式碼沒有程式碼存取的限制,且可以呼叫 Unmanaged 程式碼 (機器碼)。
SQL Server 使用主應用程式層級的程式碼存取安全性原則層來設定主應用程式原則,以根據 SQL Server 資料庫目錄中所儲存的使用權限集合來授與三個使用權限集合當中的一個。 在資料庫內執行的 Managed 程式碼一定會取得這些程式碼存取使用權限集合當中的一個。
程式設計模型限制
SQL Server 中 Managed 程式碼的程式設計模型需要有函式、程序和型別,而這些項目不需要使用跨多個引動過程之間所保有的狀態或是共用跨多個使用者工作階段的狀態。 再者,如之前所述,共用狀態的存在可能會造成嚴重的例外狀況,而這些例外狀況會影響應用程式的延展性和可靠性。
基於這些考量,SQL Server 不允許使用靜態變數和靜態資料成員。 對於 SAFE 和 EXTERNAL-ACCESS 組件而言,SQL Server 會在建立組件時檢查組件的中繼資料;如果有找到靜態資料成員和變數的使用,則會讓這類組件的建立作業失敗。