Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在SQL Server 2017中部署CLR UDF:过程_C#_Sql Server_Sqlclr - Fatal编程技术网

C# 在SQL Server 2017中部署CLR UDF:过程

C# 在SQL Server 2017中部署CLR UDF:过程,c#,sql-server,sqlclr,C#,Sql Server,Sqlclr,我正在尝试按照中描述的过程在SQL Server 2017 DB中部署CLR程序集。基本上,出于测试目的,我只包含一个带有两个基于正则表达式的函数的程序集: public class TextUdf { [SqlFunction(Name = "RegexIsMatch", IsDeterministic = true, IsPrecise = true)] public static SqlBoolean RegexIsMatch(SqlString text, SqlStri

我正在尝试按照中描述的过程在SQL Server 2017 DB中部署CLR程序集。基本上,出于测试目的,我只包含一个带有两个基于正则表达式的函数的程序集:

public class TextUdf
{
    [SqlFunction(Name = "RegexIsMatch", IsDeterministic = true, IsPrecise = true)]
    public static SqlBoolean RegexIsMatch(SqlString text, SqlString pattern,
        SqlInt32 options)
    {
        if (text.IsNull) return SqlBoolean.Null;
        if (pattern.IsNull) pattern = "";

        return Regex.IsMatch((string)text,
            (string)pattern,
            options.IsNull? RegexOptions.None : (RegexOptions)options.Value,
            new TimeSpan(0, 0, 10))
            ? SqlBoolean.True
            : SqlBoolean.False;
    }

    [SqlFunction(Name = "RegexReplace", IsDeterministic = true, IsPrecise = true)]
    public static SqlString RegexReplace(SqlString text, SqlString pattern,
        SqlString replacement, SqlInt32 options)
    {
        if (text.IsNull || pattern.IsNull) return text;

        return Regex.Replace((string)text, (string)pattern,
            (string)replacement,
            options.IsNull ? RegexOptions.None : (RegexOptions)options.Value);
    }
}
我已经在创建了完整的复制解决方案。我可以按照此处描述的整个过程(自述文件)进行操作,直到必须将PFX证书分配给要部署的CLR程序集为止。此时,我得到以下错误:

MSB3325: Cannot import the following key file: pfx. The key file may be password protected. To correct this, try to import the certificate again or manually install the certificate to the Strong Name CSP with the following key container name: ...
CREATE or ALTER ASSEMBLY for assembly 'SqlServerUdf' 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 that has a corresponding login with UNSAFE ASSEMBLY permission. Alternatively, you can trust the assembly using sp_add_trusted_assembly.
按照错误信息指南,我发现我可以通过安装带有
sn
的PFX来解决这个问题,这样我可以在提示时手动输入密码(请参阅)

完成此操作后,我可以使用UDF函数编译CLR程序集。现在,当我试图通过从0x…binary stuff…创建程序集[SqlServerUdf]将其安装到测试数据库(只是为此目的创建的一个空数据库)中时,我遇到以下错误:

MSB3325: Cannot import the following key file: pfx. The key file may be password protected. To correct this, try to import the certificate again or manually install the certificate to the Strong Name CSP with the following key container name: ...
CREATE or ALTER ASSEMBLY for assembly 'SqlServerUdf' 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 that has a corresponding login with UNSAFE ASSEMBLY permission. Alternatively, you can trust the assembly using sp_add_trusted_assembly.
为了让SQL Server在不放弃严格安全性的情况下接受我的CLR,我不得不遵循一个漫长的过程


很明显,我遗漏了一些东西,但我不确定这个复杂过程的许多细节,所以这将是一个艰难的猜测。有谁能告诉我们这个过程出了什么问题,这样我们就可以一步一步地快速了解如何在SQL Server中插入CLR程序集?这个简单的任务在最新版本中似乎变得非常困难…

根据我在GitHub存储库中看到的情况,您似乎跳过了一些步骤:

  • 您没有在原始SQL2017\u KeyAsm项目上设置密码。这就是为什么它仍然是一个.snk文件(即SQL2017\u KeyAsm.snk),而不是.pfx文件(即SQL2017\u KeyAsm.pfx)。我猜您取消选中了“使用密码保护我的密钥文件”复选框(我认为默认情况下已选中),因为您根本不应该有.snk。此外,在您的SQL2017_KeyAsm.sqlproj文件中,您当前有:

    SQL2017\u KeyAsm.snk
    
    当您应具备以下条件时:

    SQL2017\u KeyAsm.pfx
    
    尽管如此,您在自述文件中的说明是正确的,正如您在其中所述:“输入密码”。不过,这可能解释了您的密码错误,因为没有密码保护私钥。或者密码错误是由于使用了错误的pfx文件(见下文)。我想首先尝试修复以下项目,因为可能会使用无密码的SNK,我只是从来没有尝试过

  • 在“一次性程序”部分的末尾,在以“最后,以下步骤…”开头的段落后面的最后两个步骤中,步骤2使用了错误的.pfx文件。我猜这是上一步没有.pfx文件(由于没有设置密码)的直接结果,因此您抓取了那里唯一的.pfx文件。这就是为什么在尝试加载SqlServerUdf程序集时出现错误:您使用证书对程序集进行了签名,但该证书仅用作将KeyAsm程序集加载到
    [master]
    中的机制,以便可以从中提取非对称密钥。之后,证书将被删除。非对称密钥是.snk文件的公钥,该文件是在您告诉Visual Studio希望签署SQL2017\u KeyAsm项目时创建的。因此,当您告诉Visual Studio对SqlServerUdf项目进行签名时,您需要选择.snk文件(或.pfx,如果您使用密码对其进行保护)。执行此操作将使用相同的私钥对两个项目/程序集进行签名

  • 因此,要做的第一件事是更改用于签名SqlServerUdf程序集的私钥。它不应该是证书.pfx文件。它必须是用于签名KeyAsm文件的同一密钥。在您的情况下,这将是SQL2017\u KeyAsm.snk


    试着改变一下,看看是否一切正常。如果没有,则返回并向snk文件添加密码(通过VisualStudio)。您不需要重新生成证书或其.pfx文件,因为公钥应该保持不变,这就是加载到
    [master]
    中的所有内容。但是,如果这仍然不起作用,一定要告诉我。同时,我将更新该帖子,使其更明确地说明密码以及何时使用哪个pfx文件。

    您是否在SQL Server中创建了证书并进行了使用该证书的登录?Ref:(参见选项4)这帮助我解决了一个类似的问题(尽管我使用了选项3,所以我不能说这是一个多么好的解决方案)。@Natfis:只是确认一下,您能够编译/签署
    SqlServerUdf
    程序集吗?并且,您在尝试部署之前执行了PreDeploy.sql脚本,或者至少在
    SqlServerUdf
    项目中注册了PreDeploy.sql脚本?我相信我知道问题所在,并将把其余的细节放在答案中。@JasonWhitish认为SQLShack页面不错,但无助于创建自包含的部署脚本,也无助于将解决方案集成到与Visual Studio和/或自动化CI流程完全兼容的流程中。在我的帖子中列出的选项——或者——是更多的步骤,但是会导致完全自动化:-D。谢谢,这些都非常有用,我还需要检查上面的链接。同时,可能只是我,但我在VS UI中找不到任何“使用密码保护我的密钥文件”复选框(目前使用的是VS2019 RC4)。在SQLCLR选项中,我只找到了一个签名按钮,当我单击它时,我会看到一个对话框,其中有一个“对程序集进行签名”复选框,一个“选择强名称密钥文件”