引用 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服务器中使用。我该怎么做?
为了安全性和稳定性,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
是否已向数据库注册强密钥?
-
在 master 数据库中创建主密钥(如果不存在):
使用母版;
通过密码创建主密钥加密 = 'your_password';
-
在 master 数据库中为强密钥创建非对称密钥。您需要将 .snk 文件复制到数据库服务器,但注册后,您可以在服务器中删除它。
从文件 = 'path_to_the_strong_name_key' 创建非对称密钥 SQLKEY;
-
从 master 数据库中的非对称密钥创建登录名。
创建登录 您的登录名 从非对称密钥您的密钥;
-
授予您刚刚创建的登录名不安全程序集权限
向您登录授予不安全程序集;
我更喜欢直接从Visual Studio发布,但你应该能够做同样的事情。
CREATE ASSEMBLY yourSQLCLR
FROM 'C:''yourSignedSQLCLR.dll'
WITH PERMISSION_SET = UNSAFE | SAFE | EXTERNAL_ACCESS