创建包含类元数据和托管代码的托管应用程序模块,将其作为 SQL Server 实例中的对象。通过引用此模块,可在数据库中创建公共语言运行时 (CLR) 函数、存储过程、触发器、用户定义聚合以及用户定义类型。
Transact-SQL 语法约定
CREATE ASSEMBLY assembly_name
[ AUTHORIZATION owner_name ]
FROM { <client_assembly_specifier> | <assembly_bits> [ ,...n ] }
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]
[ ; ]
<client_assembly_specifier> :: =
'[\\computer_name\]share_name\[path\]manifest_file_name'
| '[local_path\]manifest_file_name'
<assembly_bits> :: =
{ varbinary_literal | varbinary_expression }
-
assembly_name
-
程序集的名称。此名称必须在数据库中唯一,并且是有效的标识符。
- AUTHORIZATION owner_name
-
指定作为程序集所有者的用户或角色的名称。owner_name 必须是当前用户所属的角色的名称,或当前用户必须具有对 owner_name 的 IMPERSONATE 权限。如果未指定,则所有权授予当前用户。
- <client_assembly_specifier>
-
指定正在上载的程序集所在的本地路径或网络位置,以及与程序集对应的清单文件名。<client_assembly_specifier> 可表示为固定字符串或其值等于固定字符串的、带有变量的表达式。CREATE ASSEMBLY 不支持加载多模块程序集。SQL Server 还将在同一位置查找此程序集的所有相关程序集,并使用与根级别程序集相同的所有者将其上载。如果没有找到这些相关程序集且它们尚未加载到当前数据库中,则 CREATE ASSEMBLY 失败。如果相关程序集已加载到当前数据库中,则这些程序集的所有者必须与新创建的程序集的所有者相同。
如果模拟的是登录用户,则无法指定 <client_assembly_specifier>。
- <assembly_bits>
-
组成程序集和依赖程序集的二进制值的列表。列表中的第一个值将视为根级程序集。与相关程序集对应的值可以按任意顺序提供。所有与根程序集的依赖项不相对应的值都将忽略。
-
varbinary_literal
-
varbinary 文字。
-
varbinary_expression
-
varbinary 类型的表达式。
- PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }
-
指定 SQL Server 访问程序集时向程序集授予的一组代码访问权限。如果未指定,则将 SAFE 用作默认值。
我们推荐使用 SAFE。SAFE 是最具限制性的权限集。由具有 SAFE 权限的程序集所执行的代码将无法访问外部系统资源,例如文件、网络、环境变量或注册表。
EXTERNAL_ACCESS 使程序集可以访问某些外部系统资源,例如文件、网络、环境变量以及注册表。
UNSAFE 可使程序集不受限制地访问资源,无论是 SQL Server 实例内部还是外部的资源都可以访问。从 UNSAFE 程序集内运行的代码可调用未托管代码。
安全说明: |
|---|
|
对于执行计算和数据管理任务而无需访问 SQL Server 实例外部资源的程序集,SAFE 是推荐的权限设置。
对于访问 SQL Server 实例外部资源的程序集,我们推荐使用 EXTERNAL_ACCESS。EXTERNAL_ACCESS 程序集包含 SAFE 程序集的可靠性和可伸缩性保护,但从安全角度而言,它与 UNSAFE 程序集类似。原因是在默认情况下,EXTERNAL_ACCESS 程序集中的代码以 SQL Server 服务帐户身份运行并访问此帐户的外部资源,除非此代码显式模拟调用方。因此,创建 EXTERNAL_ACCESS 程序集的权限应只授予以 SQL Server 服务帐户身份运行代码的可信登录。有关模拟的详细信息,请参阅 CLR 集成安全性。
指定 UNSAFE 将使程序集中的代码在 SQL Server 进程空间中完全自由地执行操作,但这些操作可能危及 SQL Server 的可靠性。UNSAFE 程序集也可能破坏 SQL Server 或公共语言运行时的安全系统。UNSAFE 权限只应授予高度可信的程序集。只有 sysadmin 固定服务器角色的成员才能创建并更改 UNSAFE 程序集。
|
有关程序集的权限集的详细信息,请参阅设计程序集。
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 的任何调用尝试都将失败。
有关详细信息,请参阅设计程序集。
需要 CREATE ASSEMBLY 权限。
如果指定 PERMISSION_SET = EXTERNAL_ACCESS,则 SQL Server 登录必须具有对服务器的 EXTERNAL ACCESS ASSEMBLY 权限。如果指定 PERMISSION_SET = UNSAFE,则需要 sysadmin 固定服务器角色的成员身份。
如果程序集已经存在于数据库中,则用户必须是将上载的程序集所引用的所有程序集的所有者。若要使用文件路径上载程序集,则当前用户必须是经过 Windows 身份验证的登录名或 sysadmin 固定服务器角色的成员。执行 CREATE ASSEMBLY 的用户的 Windows 登录名必须对此语句中加载的共享和文件具有读取权限。
有关程序集的权限集的详细信息,请参阅设计程序集。
以下示例假定:SQL Server 数据库引擎示例安装在本地计算机的默认位置,且 HelloWorld.csproj 示例应用程序已编写。有关详细信息,请参阅 关于 Hello World 示例的自述文件。
DECLARE @SamplesPath nvarchar(1024)
SELECT @SamplesPath = REPLACE(physical_name,
'Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\master.mdf',
'Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\')
FROM master.sys.database_files
WHERE name = 'master';
CREATE ASSEMBLY HelloWorld
FROM @SamplesPath + 'HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'
WITH PERMISSION_SET = SAFE;
参考
ALTER ASSEMBLY (Transact-SQL)
DROP ASSEMBLY (Transact-SQL)
CREATE FUNCTION (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
CREATE TYPE (Transact-SQL)
CREATE AGGREGATE (Transact-SQL)
EVENTDATA (Transact-SQL)
其他资源
CLR 可编程性示例
帮助和信息
获取 SQL Server 2008 帮助