共用方式為


元件 - 設計

適用於:SQL Server

本主題描述設計元件時應考慮的下列因素:

  • 封裝元件

  • 管理元件安全性

  • 元件的限制

封裝元件

元件可以包含多個 SQL Server 例程的功能,或在其類別和方法中輸入 。 大部分時候,封裝在相同元件內執行相關函式的例程功能很合理,特別是當這些例程共用方法彼此呼叫的類別時。 例如,針對 Common Language Runtime (CLR) 觸發程式和 CLR 預存程式執行數據輸入管理工作的類別可以封裝在相同的元件中。 這是因為這些類別的方法比較不相關的工作更可能彼此呼叫。

當您將程式代碼封裝成元件時,您應該考慮下列事項:

  • 依賴 CLR 使用者定義函數的 CLR 使用者定義型別和索引可能會導致儲存的數據位於相依於元件的資料庫中。 當保存的數據相依於資料庫中的元件時,修改元件的程式代碼通常會比較複雜。 因此,通常最好將保存數據相依性所依賴的程式代碼與沒有這類保存數據相依性的程式碼分開(例如使用使用者定義函式的使用者定義型別和索引)。 如需詳細資訊,請參閱實作元件ALTER ASSEMBLY (Transact-SQL)。

  • 如果一段 Managed 程式代碼需要較高的許可權,最好將該程式代碼與不需要較高許可權的程式代碼區隔成不同的元件。

管理元件安全性

您可以控制元件在執行 Managed 程式代碼時,可以存取受 .NET Code Access Security 保護的資源。 建立或修改元件時,您可以指定三個許可權集合的其中一個: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元件只能包含可驗證類型安全的程式代碼。 這表示這些元件只能透過對型別定義有效的定義進入點來存取類別。 因此,它們無法任意存取程式代碼未擁有的記憶體緩衝區。 此外,它們無法執行可能對 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

無法從 SAFE 和EXTERNAL_ACCESS元件呼叫以其中一個不允許 的 HostProtectionAttributes 標註的任何Microsoft .NET Framework API。

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 整合安全性