创建程序集

适用于:SQL Server

托管数据库对象(如存储过程或触发器)先经过编译,然后部署到称为程序集的单元中。 必须先在 Microsoft SQL Server中注册托管 DLL 程序集,然后才能使用程序集提供的功能。 若要在 SQL Server 数据库中注册程序集,请使用 CREATE ASSEMBLY 语句。 本主题讨论如何使用 CREATE ASSEMBLY 语句在数据库中注册程序集,以及如何为程序集指定安全设置。

CREATE ASSEMBLY 语句

CREATE ASSEMBLY 语句用于在数据库中创建程序集。 以下是示例:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll';  

FROM 子句指定要创建的程序集的路径名。 此路径既可以是通用命名约定 (UNC) 路径,也可以是计算机本地的物理文件路径。

SQL Server 不允许使用相同的名称、区域性和公钥来注册程序集的不同版本。

可以创建引用其他程序集的程序集。 在 SQL Server 中创建程序集时,如果引用的程序集尚未创建到数据库中,SQL Server还会创建根级程序集引用的程序集。

将向数据库用户或用户角色授予在数据库中创建进而拥有程序集的权限。 为了创建程序集,数据库用户或角色应具有 CREATE ASSEMBLY 权限。

仅当满足以下条件时,程序集才能成功地引用其他程序集:

  • 所调用或被引用的程序集由同一个用户或角色所有。

  • 所调用或被引用的程序集是在同一个数据库中创建的。

创建程序集时指定安全性

在SQL Server数据库中创建程序集时,可以指定代码可在其中运行的三个不同安全级别之一:SAFEEXTERNAL_ACCESSUNSAFE。 当 CREATE ASSEMBLY 语句运行时,对代码程序集执行某些检查,这可能会导致程序集无法在服务器上注册。

SAFE 是默认权限集,适用于大多数方案。 若要指定给定的安全级别,您可以按如下所示修改 CREATE ASSEMBLY 语句的语法:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = SAFE;  

还可以通过省略上面的第三行代码来创建具有 SAFE 权限集的程序集:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll';  

程序集中的代码在 SAFE 权限集下运行时,它只能通过进程内托管提供程序在服务器中进行计算和数据访问。

创建 EXTERNAL_ACCESS 和 UNSAFE 程序集

EXTERNAL_ACCESS 解决了代码需要访问服务器外部资源(例如文件、网络、注册表和环境变量)的方案。 只要服务器访问外部资源,它就会模拟调用托管代码的用户的安全上下文。

UNSAFE 代码权限适用于程序集无法验证安全或需要对受限资源(例如 Microsoft Win32 API)进行额外访问的情况。

若要在 SQL Server 中创建EXTERNAL_ACCESSUNSAFE 程序集,必须满足以下两个条件之一:

  1. 程序集经过了强名称签名或使用证书进行了 Authenticode 签名。 此强名称 (或证书) 在SQL Server内创建为非对称密钥 (或证书) ,并且具有相应的外部访问程序集权限 (,) 或不安全程序集) 的 UNSAFE ASSEMBLY 权限 (。

  2. 数据库所有者 (DBO) 具有 EXTERNAL ACCESS 程序集的外部访问程序集 () 或 UNSAFE 程序集 (的 UNSAFE 程序集) 权限,并且数据库的 TRUSTWORTHY Database 属性设置为 ON

在加载程序集(包括执行)时,也将检查上面所列的两个条件。 至少必须满足这些条件之一才能加载程序集。

建议不要将数据库中的 TRUSTWORTHY Database 属性 设置为 ON ,仅在服务器进程中运行公共语言运行时 (CLR) 代码。 而是建议在 master 数据库中通过程序集文件创建非对称密钥。 然后,必须创建映射到此非对称密钥的登录名,并且必须授予该登录名 外部访问程序集UNSAFE ASSEMBLY 权限。

以下 Transact-SQL 语句执行创建非对称密钥、将登录名映射到此密钥,然后授予 登录名EXTERNAL_ACCESS 权限所需的步骤。 在运行 CREATE ASSEMBLY 语句之前,必须运行以下 Transact-SQL 语句。

USE master;   
GO    
  
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll'     
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey     
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;   
GO   

注意

必须创建新的登录名以与非对称密钥关联。 此登录名仅用于授予权限;不必与用户关联或在应用程序中使用。

若要创建 EXTERNAL ACCESS 程序集,创建者需要具有 EXTERNAL ACCESS 权限。 此权限在创建程序集时指定:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = EXTERNAL_ACCESS;  

以下 Transact-SQL 语句执行创建非对称密钥、将登录名映射到此密钥,然后授予对登录名 的 UNSAFE 权限所需的步骤。 在运行 CREATE ASSEMBLY 语句之前,必须运行以下 Transact-SQL 语句。

USE master;   
GO    
  
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';     
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey ;    
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin ;  
GO  

若要指定使用 UNSAFE 权限加载程序集,请在将程序集加载到服务器时指定 UNSAFE 权限集:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = UNSAFE;  

有关每个设置的权限的更多详细信息,请参阅 CLR Integration Security

另请参阅

管理 CLR 集成程序集
改变程序集
删除程序集
CLR 集成代码访问安全性
TRUSTWORTHY 数据库属性