Visual Studio SSDT项目中签名SQL Server CLR DLL遇问题求助
SSDT中CLR程序集签名发布问题排查
背景
用户在Visual Studio数据库项目(SSDT)中尝试为CLR程序集签名以发布到SQL Server,但多次尝试均失败。不过手动签名流程可成功执行,步骤如下:
手动签名成功流程
- 在SQL Server中创建证书并导出
- 使用
pvk2pfx.exe将PVK格式证书转换为PFX格式:
pvk2pfx.exe -pvk C:\Certs\ClrCert.pvk -spc C:\Certs\ClrCert.cer -pfx C:\Certs\ClrCert.pfx -pi Pa$$w0rd -po Pa$$w0rd
- 使用
signtool.exe为项目BIN文件夹中的DLL签名:
signtool.exe sign /fd SHA256 /f C:\Certs\ClrCert.pfx /p Pa$$w0rd C:\...\bin\Release\ClrTest.dll
- 导入已签名的程序集并执行:
-- 导入程序集 CREATE ASSEMBLY CLRTest FROM 'C:\...\CLRTest.dll' WITH PERMISSION_SET = SAFE; GO -- 从程序集导入函数 CREATE FUNCTION [dbo].[FooFunction] (@year INT NULL) RETURNS BIT AS EXTERNAL NAME [CLRTest].[UserDefinedFunctions].[FooFunction] -- 执行函数 select dbo.FooFunction(2022)
尝试1:构建后事件签名失败原因
操作步骤
- 在项目属性中设置构建后事件命令行:
项目 > 属性 > 生成事件 : 生成后事件命令行,命令为:
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\signtool.exe" sign /fd SHA256 /f C:\Certs\ClrCert.pfx /p Pa$$w0rd "C:\Workspace\CLRTest\bin\Release\ClrTest.dll"
- 构建输出显示DLL签名成功,但发布时出现错误:
CREATE or ALTER ASSEMBLY for assembly 'CLRTest' with the SAFE or EXTERNAL_ACCESS option failed because the 'clr strict security' option of sp_configure is set to 1.
Microsoft recommends that you sign the assembly with a certificate or asymmetric key...
原因分析
SSDT的发布流程不会直接使用bin\Release目录下的已签名DLL。发布时,SSDT会重新生成程序集文件(通常调用obj目录下的中间文件或重新编译),覆盖了构建后事件签名的版本,导致最终发布到SQL Server的是未签名的程序集,触发clr strict security的校验错误。
尝试2:Visual Studio签名向导错误排查
操作步骤
- 打开签名设置窗口:
项目 > 属性 > SQLCLR > 签名 - 选择证书并提供密码
- 构建时出现错误:
Cannot import the following key file: ..........\Certs\ClrCert.pfx. The key file may be password protected.
错误原因及解决方向
- 相对路径错误:多层相对路径
..\..\..\..\..\Certs\ClrCert.pfx可能指向了错误位置,导致Visual Studio无法找到PFX文件,建议改用绝对路径测试。 - 密码不匹配:输入的密码与PFX文件的保护密码不一致,需确认密码正确性。
- 文件权限问题:Visual Studio进程没有访问该PFX文件的权限,可尝试将PFX文件复制到项目目录下,或调整文件权限赋予Visual Studio访问权限。
- PFX文件损坏:PFX文件本身损坏无法正常导入,可重新生成PFX文件测试。
内容的提问来源于stack exchange,提问作者Muflix
相关产品推荐
相关产品推荐

