分享方式:


設計元件

適用於:SQL Server

本文說明設計元件時應考慮的下列因素:

  • 封裝元件
  • 管理元件安全性
  • 元件的限制

封裝元件

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

當您將程式代碼封裝成元件時,請考慮:

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

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

管理元件安全性

您可以控制元件在執行 Managed 程式代碼時,可以存取受 .NET Code Access Security 保護的資源。 建立或修改元件時,您可以指定三個許可權集合的其中一個: SAFEEXTERNAL_ACCESSUNSAFE

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 或 Common Language Runtime 的安全性系統。 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

此外, SAFEEXTERNAL_ACCESS 元件無法以下列自訂屬性標註:

System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute

不允許的 .NET Framework API

任何以不允許的 .NET Framework API HostProtectionAttributes 標註的任何Microsoft,都無法從 SAFEEXTERNAL_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