本主题介绍在设计程序集时应考虑的以下因素:
打包程序集
管理程序集安全性
对程序集的限制
打包程序集
程序集可以包含多个 SQL Server 例程的功能,或在其类和方法中键入。 在大部分时间里,打包在同一程序集中执行相关函数的例程的功能才有意义,如果这些例程共享相互调用方法的类,则尤为如此。 例如,可以将执行公共语言运行时 (CLR) 触发器和 CLR 存储过程的数据项管理任务的类在同一程序集中打包。 这是因为这些类的方法比那些不太相关的任务更可能相互调用。
将代码打包到程序集中时,应考虑以下事项:
依赖于 CLR 用户定义函数的 CLR 用户定义类型和索引可以导致持久化数据存在于依赖程序集的数据库中。 当存在依赖于数据库中程序集的持久化数据时,修改程序集的代码通常更为复杂。 因此,通常最好将持久化数据依赖项依赖的代码(如使用用户定义的函数的用户定义类型和索引)与没有此类持久化数据依赖项的代码分开。 有关详细信息,请参阅 实现程序集 和 ALTER ASSEMBLY (Transact-SQL)。
如果一段托管代码需要更高的权限,最好将该代码与不需要更高权限的代码分开到单独的程序集中。
管理程序集安全性
当程序集运行托管代码时,可以控制程序集访问受 .NET 代码访问安全性保护的资源的程度。 创建或修改程序集时,可以通过指定三个权限集之一来执行此作:SAFE、EXTERNAL_ACCESS或 UNSAFE。
安全
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 允许程序集不受限制地访问 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
无法从 SAFE 和EXTERNAL_ACCESS程序集调用任何使用不允许的 HostProtectionAttributes 进行批注的 .NET Framework API Microsoft。
eSelfAffectingProcessMgmt
eSelfAffectingThreading
eSynchronization
eSharedState
eExternalProcessMgmt
eExternalThreading
eSecurityInfrastructure
eMayLeakOnAbort
eUI
支持的 .NET Framework 程序集
自定义程序集引用的任何程序集都必须使用 CREATE ASSEMBLY 加载到 SQL Server 中。 以下 .NET Framework 程序集已加载到 SQL Server 中,因此,自定义程序集可以引用,而无需使用 CREATE ASSEMBLY。
custommarshallers.dll
Microsoft.visualbasic.dll
Microsoft.visualc.dll
mscorlib.dll
system.data.dll
System.Data.SqlXml.dll
system.dll
system.security.dll
system.web.services.dll
system.xml.dll
System.Transactions
System.Data.OracleClient
System.Configuration