CREATE ASSEMBLY 将上载以前由托管代码编写为 .dll 文件的程序集,以便在 SQL Server 实例中使用。
SQL Server 不允许使用相同的名称、区域性和公钥来注册程序集的不同版本。
当尝试访问 <client_assembly_specifier> 中指定的程序集时,SQL Server 将模拟当前 Windows 登录的安全上下文。如果 <client_assembly_specifier> 指定了网络位置(UNC 路径),则由于委托限制,当前登录名的模拟将不应用于网络位置。在这种情况下,将使用 SQL Server 服务帐户的安全上下文进行访问。有关详细信息,请参阅凭据(数据库引擎)。
除了 assembly_name 指定的根程序集外,SQL Server 还试图上载正在上载的根程序集所引用的所有程序集。如果前面的 CREATE ASSEMBLY 语句已将被引用的程序集上载到数据库中,则不再上载此程序集,但它仍可用于根程序集。如果以前未上载相关程序集,但 SQL Server 无法在源目录中找到它的清单文件,则 CREATE ASSEMBLY 将返回错误。
如果根程序集引用的所有相关程序集尚未在数据库中并且与根程序集一起隐式加载,则它们与根级别程序集具有相同的权限设置。如果必须使用不同于根级别程序集的权限设置创建相关程序集,则它们必须在具有相应权限设置的根级别程序集之前显式上载。
程序集验证
SQL Server 将对 CREATE ASSEMBLY 语句上载的程序集二进制文件执行检查,以确保符合以下要求:
-
程序集二进制文件具有格式正确的有效元数据和代码段,并且代码段包含有效的 Microsoft 中间语言 (MSIL) 指令。
-
所引用的一组系统程序集是 SQL Server 中以下支持的程序集之一:Microsoft.Visualbasic.dll、Mscorlib.dll、System.Data.dll、System.dll、System.Xml.dll、Microsoft.Visualc.dll、Custommarshallers.dll、System.Security.dll、System.Web.Services.dll、System.Data.SqlXml.dll、System.Core.dll 和 System.Xml.Linq.dll。还可引用其他系统程序集,但这些程序集必须在数据库中显式注册。
-
对于使用 SAFE 或 EXTERNAL ACCESS 权限集创建的程序集:
-
程序集代码应是类型安全的。通过对程序集运行公共语言运行时验证工具可建立类型安全。
-
程序集的类中不应包含任何静态数据成员,除非这些成员标记为只读。
-
程序集中的类不能包含终结器方法。
-
程序集的类或方法只能使用允许的代码属性进行注释。有关详细信息,请参阅CLR 例程的自定义属性。
除了执行 CREATE ASSEMBL 时进行的上述检查外,在执行程序集中代码时还应进行其他检查:
-
如果程序集的权限集不包括此权限,则调用某些需要特定代码访问权限的 Microsoft .NET Framework API 可能失败。
-
对于 SAFE 和 EXTERNAL_ACCESS 程序集,对使用某些 HostProtectionAttribute 注释的 .NET Framework API 的任何调用尝试都将失败。
有关详细信息,请参阅设计程序集。