4

我有一个用于某些 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。

我真的只想拥有一个可以在 GAC 和 SQL 服务器中使用的 DLL 版本。我怎样才能做到这一点?

4

2 回答 2

1

出于安全性和稳定性考虑,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 
于 2016-07-15T12:15:19.580 回答
1

您是否在数据库中注册了强密钥?

  1. 在 master 数据库中创建一个主密钥,如果不存在:

    使用大师;

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

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

    CREATE ASYMMETRIC KEY sqlkey FROM FILE = 'path_to_the_strong_name_key';

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

    CREATE LOGIN yourlogin FROM ASYMMETRIC KEY yourkey;

  4. 给刚刚创建的登录名 UNSAFE ASSEMBLY 权限

    将不安全的程序集授予您的登录名;

我更喜欢直接从 Visual Studio 发布,但您应该也可以这样做。

 CREATE ASSEMBLY yourSQLCLR
 FROM 'C:\\yourSignedSQLCLR.dll' 
 WITH PERMISSION_SET = UNSAFE | SAFE |  EXTERNAL_ACCESS
于 2016-07-16T14:57:08.730 回答