【问题标题】:MSSQL 2012 creating CLR triggers for WCF failsMSSQL 2012 为 WCF 创建 CLR 触发器失败
【发布时间】:2012-05-08 16:26:40
【问题描述】:

我创建了使用 CLR 触发器连接到 WCF 服务器并通知它有关数据库更改的系统。 它在 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, 版本=3.0.0.0,文化=中性,publickeytoken=b77a5c561934e089, 处理器架构=msil。您正在注册未经过全面测试 在 SQL Server 托管环境中,不受支持。在里面 将来,如果您升级或维修此程序集或 .NET Framework, 您的 CLR 集成例程可能会停止工作。请参考 SQL Server 在线书籍了解更多详情。消息 6586,第 16 层,状态 1,第 2 行 无法安装程序集“SMdiagnostics”,因为现有 政策会阻止它被使用。

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

【问题讨论】:

  • MSDN 论坛上的人们指出,我试图将程序集从 .net 版本 3.0 加载到支持框架 4.0 或更高版本的 SQL Server 2012 中。这解决了一些问题,但我仍然无法从 CLR 触发器加载一些我需要使用 WCF 的程序集。 blogs.msdn.com/b/dohollan/archive/2012/04/20/…

标签: wcf triggers clr .net-assembly sql-server-2012


【解决方案1】:

我们在一个月前就同一问题向 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 年以来发生过任何与此相关的事情吗?我仍然收到错误,这是相当大的绊脚石
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    详情请见MSDN thread

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

    脚本:

    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.
    

    【讨论】:

    • SQL 2012 可以很好地加载 .Net 2.0、.Net 3.0 和 .Net 3.5 程序集。
    • 当然,但是 AFAIK 默认策略禁止加载较旧的程序集。至少我们的安装是这样的。尽管如此,我仍然遇到格式错误或非纯程序集的问题。
    • @RemusRusanu 谁能告诉我如何加载早期版本?我得到:“无法安装程序集 'X',因为现有策略会阻止它被使用。”
    【解决方案4】:

    在 SQL Server 2012 中无法为 System.IdentityModel.dll 为 .NET 框架 4.0 版本创建组件的问题已通过 .NET 团队最近发布的安全修补程序得到解决。

    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 没有问题。

    内森·舍纳克 SQL 支持技术主管

    【讨论】:

    • 我的服务器说无法安装 KB(我尝试了所有 3 种风格,以防万一)。您是如何设法导入 .Net 4.5 程序集的?我的 SQL 不断告诉我“...您正在注册的未在 SQL Server 托管环境中完全测试 ...”。
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 2011-07-26
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多