10

我创建了使用 CLR 触发器连接到 WCF 服务器并通知它有关 DB 更改的系统。它在 SQL Server 2008 R2 上运行正常。现在我尝试在 SQL Server 2012 上迁移。要使用 WCF,我需要加载 SMDiagnostics.dll 程序集以及其他程序集。我检查了 db 中是否启用了 clr,并将 trustworthy 设置为“on”,我禁用了 WCF 调试,我检查了 SQL 服务器是否在本地系统帐户下运行,因此权限没有问题。现在我的问题是当我运行以下命令时

IF  NOT EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N'SMdiagnostics')
create assembly [SMdiagnostics]
from  'C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication        Foundation\SMdiagnostics.dll'
with permission_set = unsafe
go

我收到以下错误

警告:Microsoft .NET Framework 程序集 'smdiagnostics,version=3.0.0.0,culture=neutral,publickeytoken=b77a5c561934e089,processorarchitecture=msil。' 您注册的内容未在 SQL Server 托管环境中进行全面测试,因此不受支持。将来,如果您升级或维修此程序集或 .NET Framework,您的 CLR 集成例程可能会停止工作。有关详细信息,请参阅 SQL Server 联机丛书。消息 6586,级别 16,状态 1,行 2 组件“SMdiagnostics”无法安装,因为现有策略将阻止使用它。

SMdiagnostics.dll 存在于指定路径。据我了解它在 SQL Server 2012 或 GAC 中的某种政策,但是我找不到任何关于 SMdiagnostics 的政策。任何想法如何解决它?谢谢。

4

4 回答 4

12

一个月前,我们就同一问题向 Microsoft 提交了一个问题。我的猜测是您无法加载 System.IdentityModel.dll,它是 System.ServiceModel 程序集的依赖项。Microsoft 已向我们表明,虽然这在 SQL 2005 和 SQL 2008 中有效,但它是 SQL 2012 中的一个已知错误,并且他们不会在 SQL 2014 之前修复它。

除了 2012 年还很新,这件事还没有广为人知,这让我有点意外。但这意味着您不能使用我所说的 Microsoft 在 SQL CLR (WCF) 中的最佳实践进程间通信技术,请注意 .NET 远程处理也将被淘汰,因为它也使用 ServiceModel 程序集。

我希望能更清楚地说明他们会说我们应该改用什么,我正在研究是否有办法编写基于 WSE 的 SQL CLR,但对前景并不十分兴奋。

我对此感到非常不满,并希望其他提高声音的人指出这是一个真正的问题,应该被认为是不可接受的。

于 2012-10-29T22:49:11.763 回答
6

内森·舍纳克。是的,http://support.microsoft.com/kb/2742595修复了 System.IdentityModel.dll 的问题,但使用 System.Data.Services.dll 我仍然收到错误:为程序集“System.Data.Services”创建组件失败,因为程序集“microsoft.visualbasic.activities.compiler”格式错误或不是纯 .NET 程序集。无法验证的 PE 标头/本机存根。谢谢。

于 2013-02-15T17:10:19.303 回答
5

SQL 2012 切换到框架版本 4.0.30319。因此,默认情况下,您将无法从旧框架加载程序集。

有关详细信息,请参阅MSDN 线程

不幸的是,也无法从框架版本 4 加载 System.ServiceModel 程序集,因为它依赖于不是纯 .NET 程序集的 Microsoft.VisualBasic.Activities.Compiler。

脚本:

CREATE ASSEMBLY [System.ServiceModel]
AUTHORIZATION [dbo]
FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.ServiceModel.dll'
WITH PERMISSION_SET = UNSAFE;

我总是收到以下错误:

Msg 6544, Level 16, State 1, Line 1
CREATE ASSEMBLY for assembly 'Microsoft.VisualBasic.Activities.Compiler' failed because assembly 'Microsoft.VisualBasic.Activities.Compiler' is malformed or not a pure .NET assembly. 
Unverifiable PE Header/native stub.
于 2013-02-01T13:20:51.443 回答
1

.NET 团队最近发布的安全修补程序解决了 SQL Server 2012 中 .NET 框架 4.0 版本的 System.IdentityModel.dll 无法创建程序集的问题。

MS13-004:Windows XP、Windows Server 2003、Windows Vista、Windows Server 2008、Windows 7 和 Windows Server 2008 R2 上的 .NET Framework 4 安全更新说明:2013 年 1 月 8 日 http://support.microsoft .com/kb/2742595

我的测试表明,在 SQL Server 2012 中使用 System.IdentityModel.dll 的 .NET 4.5 程序集 CREATE ASSEMBLY 没有问题。

Nathan Schoenack SQL 支持技术主管

于 2013-02-13T21:41:38.300 回答