引用 SQL Server 2008R2 中的已签名程序集

本文关键字:程序集 SQL Server 2008R2 引用 | 更新日期: 2023-09-27 18:35:42

我有一个在某些 SSIS 脚本任务中使用的 C# .NET 3.5 类库 (DLL),因此必须将其加载到 GAC,这意味着必须对其进行签名。我创建了一个密钥并对 DLL 进行了签名,它在 SSIS 中工作。

现在,我还想将此 DLL 加载到 SQL 服务器,并创建了一些 CLR 对象,这些对象引用此 DLL 中类中的方法。我有一个 VS2012 数据库项目,并添加了对 DLL 的引用,将 IsVisible 和 ModelAware 属性设置为 true。我扩展了 UserDefinedFunctions 类以添加在 DLL 中调用静态方法的两个函数。

我的数据库项目中引用的程序集和 CLR 对象都设置为 SAFE,因为它们不需要除数据库中的内容之外的任何内容。

项目构建,但在发布到我的本地数据库时失败,出现以下奇怪错误:

Creating [<<REFERENCED_DLL>>]...
Creating [<<CURRENT_DATABASE_CLR>>]...
(288,1): SQL72014: .Net SqlClient Data Provider: 
   Msg 6218, Level 16, State 2, Line 1 
   CREATE ASSEMBLY for assembly '<<CURRENT_DATABASE_CLR>>' failed
   because assembly '<<CURRENT_DATABASE_CLR>>' failed verification. 
   Check if the referenced assemblies are up-to-date and trusted 
   (for external_access or unsafe) to execute in the database.
   CLR Verifier error messages if any will follow this message
[ : UserDefinedFunctions::sf_Function1][mdToken=0x6000001][offset 0x00000005]
   Unable to resolve token.
[ : UserDefinedFunctions::sf_Function2][mdToken=0x6000002][offset 0x00000005] 
   Unable to resolve token.

疯狂的是,如果我构建了<<REFERENCED_DLL>>程序集并且没有对其进行签名,则项目发布正常,函数按预期工作。我尝试对数据库项目进行签名,并将AllowPartiallyTrustedCallers添加到引用的 DLL。

我真的只想有一个版本的这个DLL,可以在GAC和SQL服务器中使用。我该怎么做?

引用 SQL Server 2008R2 中的已签名程序集

为了安全性和稳定性,SQLCLR 只能对一小部分已批准的 GAC 程序集进行有限访问。 所有其他必须在数据库中显式注册。

请参阅 https://msdn.microsoft.com/en-us/library/MS403279(v=sql.105).aspx

SQL Server CLR 只允许从 GAC 加载以下内容:

CustomMarshalers
Microsoft.VisualBasic
Microsoft.VisualC
mscorlib
System
System.Configuration
System.Data
System.Data.OracleClient
System.Data.SqlXml
System.Deployment
System.Security
System.Transactions
System.Web.Services
System.Xml 

是否已向数据库注册强密钥?

  1. 在 master 数据库中创建主密钥(如果不存在):

    使用母版;

    通过密码创建主密钥加密 = 'your_password';

  2. 在 master 数据库中为强密钥创建非对称密钥。您需要将 .snk 文件复制到数据库服务器,但注册后,您可以在服务器中删除它。

    从文件 = 'path_to_the_strong_name_key' 创建非对称密钥 SQLKEY;

  3. 从 master 数据库中的非对称密钥创建登录名。

    创建登录 您的登录名 从非对称密钥您的密钥;

  4. 授予您刚刚创建的登录名不安全程序集权限

    向您登录授予不安全程序集;

我更喜欢直接从Visual Studio发布,但你应该能够做同样的事情。

 CREATE ASSEMBLY yourSQLCLR
 FROM 'C:''yourSignedSQLCLR.dll' 
 WITH PERMISSION_SET = UNSAFE | SAFE |  EXTERNAL_ACCESS