程序集 - 设计

适用于:SQL Server

本主题说明了设计程序集时应考虑的下列因素:

  • 打包程序集

  • 管理程序集安全性

  • 对程序集的限制

打包程序集

程序集可以包含多个SQL Server例程的功能,或者在其类和方法中键入。 在大部分时间里,打包在同一程序集中执行相关函数的例程的功能才有意义,如果这些例程共享相互调用方法的类,则尤为如此。 例如,可以将执行公共语言运行时 (CLR) 触发器和 CLR 存储过程的数据项管理任务的类在同一程序集中打包。 这是因为这些类的方法比起不相关的任务而言更可能调用对方。

将代码打包到程序集中时,应考虑以下内容:

  • 依赖于 CLR 用户定义函数的 CLR 用户定义类型和索引可以导致持久化数据存在于依赖程序集的数据库中。 数据库中具有依赖于程序集的持久化数据时,修改程序集的代码通常更加复杂。 因此,通常将持久化数据相关性依赖(例如使用用户定义函数的用户定义类型和索引)的代码与没有这种持久化数据相关性的代码分开更好。 有关详细信息,请参阅 实现程序集ALTER ASSEMBLY (Transact-SQL)

  • 如果托管代码需要更高的权限,最好将该代码与不需要更高权限的代码分开,并将其放入单独的程序集。

管理程序集安全性

当程序集运行托管代码时,可以控制程序集访问受 .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 程序集只能包含可验证为类型安全的代码。 这意味着这些程序集仅可以通过对类型定义有效的具有定义完善的入口点来访问类。 因此,它们不能随意访问不属于该代码所有的内存缓冲区。 此外,它们无法执行可能对SQL Server进程的可靠性产生不利影响的操作。

UNSAFE

UNSAFE 允许程序集不受限制地访问SQL Server内外的资源。 在 UNSAFE 程序集内运行的代码可以调用非托管代码。

同时,指定 UNSAFE 将允许程序集中的代码执行 CLR 验证工具认为是非安全类型的操作。 这些操作可能会以不受控制的方式访问SQL Server进程空间中的内存缓冲区。 UNSAFE 程序集也可能破坏 SQL Server 或公共语言运行时的安全系统。 有经验的开发人员或管理员应仅向高度可信的程序集授予 UNSAFE 权限。 只有 sysadmin 固定服务器角色的成员才能创建 UNSAFE 程序集。

对程序集的限制

SQL Server对程序集中的托管代码施加某些限制,以确保它们能够以可靠且可缩放的方式运行。 这意味着在 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 集成安全性