組件 - 設計

適用於:SQL Server

此主題描述以下在設計組件時應該考慮的因數:

  • 封裝組件

  • 管理組件安全性

  • 組件的限制

封裝組件

元件可以包含多個SQL Server常式的功能,或在其類別和方法中輸入。 大部分的情況下,封裝會在相同組件內執行相關函數的常式功能很有用處,尤其如果這些常式共用會彼此呼叫的類別。 例如,可為 Common Language Runtime (CLR) 觸發程序及 CLR 預存程序執行資料項目管理工作的類別,就可以封裝在相同的組件中。 這是因為這些類別的方法跟較不相關的那些工作相比,比較可能會彼此呼叫。

將程式碼封裝到組件時,應該要考慮以下事項:

  • CLR 使用者定義型別及相依於 CLR 使用者自訂函數的索引,會導致保留的資料放在相依於組件的資料庫中。 資料庫中有相依於組件的保存資料時,修改組件的程式碼通常更為複雜。 因此,一般最好將保存資料相依性所依賴的程式碼 (例如,使用者定義型別及使用使用者自訂函數的索引),跟沒有這類保存資料相依性的程式碼分開。 如需詳細資訊,請參閱 實作元件ALTER ASSEMBLY (Transact-SQL)

  • 如果有段 Managed 程式碼需要更高的權限,最好將那個程式碼跟不需要較高權限的程式碼分隔,放在個別的組件。

管理組件安全性

您可以控制在執行 Managed 程式碼時,可存取受到「.NET 程式碼存取安全性」保護之資源的組件多寡。 建立或修改組件時,指定三種權限集之一,就可以完成此動作:SAFE、EXTERNAL_ACCESS 或 UNSAFE。

SAFE

SAFE 是預設的權限集,而且其限制最為嚴格。 由具有 SAFE 權限的組件執行的程式碼,無法存取外部系統資源,例如,檔案、網路、環境變數或登錄。 SAFE 程式碼可以從本機SQL Server資料庫存取資料,或執行不涉及存取本機資料庫外部資源的計算和商務邏輯。

大部分元件都會執行計算和資料管理工作,而不需要存取SQL Server以外的資源。 因此,建議您將 SAFE 作為組件權限集。

EXTERNAL_ACCESS

EXTERNAL_ACCESS 可讓組件存取特定的外部系統資源,例如,檔案、網路、Web 服務、環境變數及登錄。 只有具有 EXTERNAL ACCESS 許可權的SQL Server登入才能建立EXTERNAL_ACCESS元件。

SAFE 及 EXTERNAL_ACCESS 組件只能包含可驗證類型安全 (verifiably type-safe) 的程式碼。 這代表如果這些組件要存取類別,只能透過定義完善、對該類型定義有效的進入點。 因此,他們不能任意存取不屬於該程式碼的記憶體緩衝區。 此外,它們無法執行可能會對SQL Server程式健全性造成負面影響的作業。

UNSAFE

UNSAFE 可讓元件不受限制地存取SQL Server內外的資源。 由 UNSAFE 組件內執行的程式碼可以呼叫 Unmanaged 程式碼。

此外,指定 UNSAFE 可讓組件中的程式碼,執行 CLR 檢查器視為類型安全的作業。 這些作業可能會以不受控制的方式存取SQL Server進程空間中的記憶體緩衝區。 UNSAFE 組件也可能會破壞 SQL Server 或通用語言執行平台的安全性系統。 UNSAFE 權限應只能由經驗豐富的開發人員或系統管理員,授與高度信任的組件。 只有 系統管理員 固定伺服器角色的成員可以建立 UNSAFE 元件。

組件的限制

SQL Server在元件中對 Managed 程式碼進行某些限制,以確保它們可以以可靠且可調整的方式執行。 這代表不會允許在 SAFE 及 EXTERNAL_ACCESS 組件中,執行會危害伺服器強固性的特定作業。

不允許的自訂屬性

不能以下列自訂屬性註解組件:

System.ContextStaticAttribute  
System.MTAThreadAttribute  
System.Runtime.CompilerServices.MethodImplAttribute  
System.Runtime.CompilerServices.CompilationRelaxationsAttribute  
System.Runtime.Remoting.Contexts.ContextAttribute  
System.Runtime.Remoting.Contexts.SynchronizationAttribute  
System.Runtime.InteropServices.DllImportAttribute   
System.Security.Permissions.CodeAccessSecurityAttribute  
System.STAThreadAttribute  
System.ThreadStaticAttribute  

此外,不能以下列自訂屬性註解 SAFE 和 EXTERNAL_ACCESS 組件:

System.Security.SuppressUnmanagedCodeSecurityAttribute  
System.Security.UnverifiableCodeAttribute  

不允許的 .NET Framework API

任何以不允許的 HostProtectionAttributes批註的 Microsoft .NET Framework API 都無法從 SAFE 和EXTERNAL_ACCESS元件呼叫。

eSelfAffectingProcessMgmt  
eSelfAffectingThreading  
eSynchronization  
eSharedState   
eExternalProcessMgmt  
eExternalThreading  
eSecurityInfrastructure  
eMayLeakOnAbort  
eUI  

支援的 .NET Framework 組件

自訂群組件所參考的任何元件都必須使用 CREATE ASSEMBLY 載入SQL Server。 下列.NET Framework元件已載入SQL Server,因此,自訂群組件可以參考,而不需要使用 CREATE ASSEMBLY。

CustomMarshalers.dll  
Microsoft.VisualBasic.dll  
Microsoft.VisualC.dll  
mscorlib.dll  
System.dll  
System.Configuration.dll  
System.Core.dll  
System.Data.dll  
System.Data.OracleClient.dll  
System.Data.SqlXml.dll  
System.Deployment.dll  
System.Security.dll  
System.Transactions.dll  
System.Web.Services.dll  
system.Xml.dll  
System.Xml.Linq.dll  

另請參閱

組件 (資料庫引擎)
CLR 整合安全性