【问题标题】:SQL Server 2016 ALTER ASSEMBLY command fails -- not a compatible upgradeSQL Server 2016 ALTER ASSEMBLY 命令失败——不是兼容升级
【发布时间】:2020-09-07 11:30:21
【问题描述】:

我正在尝试使用以下命令更改 SQL Server 2016 中的程序集:

alter assembly mylib from 'F:\Microsoft SQL Server (x86)\mylib.dll'

但我收到此错误:

从 'mylib 更改程序集,版本 = 17.0.0.20501,文化 = 中性, publickeytoken=11140e03aaa52226,处理器架构=msil' 'mylib,版本=0.0.0.0,文化=中性,publickeytoken=null, processorarchitecture=msil' 不是兼容升级。

mylib.dll 编译时将 AssemblyVersion、AssemblyFileVersion 和 AssemblyInformationalVersion 都设置为“19.17.0.0”。是不是因为 SQL Server 认为 dll 是 0.0.0.0 版本?

作为测试,如果我执行这些命令:

alter assembly mylib1 from 'F:\Microsoft SQL Server (x86)\mylib.dll'
select clr_name from sys.assemblies where name='mylib1'

clr_name 的值为:

idclib1,版本=0.0.0.0,文化=中性,publickeytoken=null, 处理器架构=msil

所以我想我需要以某种方式指定版本,但我不知道该怎么做。

如果程序集未签名,则此链接指示版本显示为 0.0.0.0:https://feedback.azure.com/forums/908035-sql-server/suggestions/32900083--version-incorrectly-showing-as-0-0-0-0-in-sys-as。我将尝试签署程序集,看看是否能解决问题。

请帮忙!

【问题讨论】:

  • 您还有其他引用 mylib 的程序集吗?他们可能在项目的程序集引用中设置了SpecificVersion: true
  • @AlwaysLearning 我希望我知道如何使用 T-SQL 进行检查。
  • 您必须审核来自select * from sys.assemblies 的已注册程序集列表,并检查项目文件中是否有任何属于您的。在干净的服务器 [数据库] 上,我只希望看到来自 Microsoft 的 Microsoft.SqlServer.Types

标签: sql-server clr sql-server-2016


【解决方案1】:

我解决了这个问题。

首先,程序集需要使用强名称密钥文件进行签名。密钥文件不需要使用密码保护。这会产生一个带有 publickeytoken 的程序集。当在签名的程序集上使用 CREATE ASSEMBLY 或 ALTER ASSEMBLY 命令时,publickeytoken 和版本将出现在 sys.assemblies 表的 clr_name 列中。

其次,必须使用原来用于对程序集进行签名的相同强名称密钥文件对新版本的程序集进行签名;如果使用不同的密钥文件,则 ALTER ASSEMBLY 命令将失败,因为 publickeytoken 将不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多