Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Sql server SQL Server 2017 Management Studio:创建程序集错误_Sql Server_Sqlclr - Fatal编程技术网

Sql server SQL Server 2017 Management Studio:创建程序集错误

Sql server SQL Server 2017 Management Studio:创建程序集错误,sql-server,sqlclr,Sql Server,Sqlclr,我在C#中创建了用户定义的类型 当我运行此命令时: EXEC sp_configure 'clr enabled', 1; RECONFIGURE; GO EXEC sp_configure 'show advanced option', '1'; RECONFIGURE; GO USE NameOfDatabase CREATE ASSEMBLY Database1 FROM 'C:\Users\MyDoc\Desktop\Project\Database1\Dat

我在C#中创建了用户定义的类型

当我运行此命令时:

EXEC sp_configure 'clr enabled', 1;  
RECONFIGURE;  
GO  

EXEC sp_configure 'show advanced option', '1'; 
RECONFIGURE;  
GO  

USE NameOfDatabase

CREATE ASSEMBLY Database1
FROM 'C:\Users\MyDoc\Desktop\Project\Database1\Database1\bin\Debug\Database1.dll'
WITH PERMISSION_SET = SAFE; 

CREATE TYPE [dbo].[TypeName] EXTERNAL NAME [Database1].[NameInC#];
我得到一个错误:

味精10343,第14级,状态1,第10行
使用安全或外部访问选项为程序集“Database1”创建或更改程序集失败,因为sp_configure的“clr strict security”选项设置为1。Microsoft建议您使用证书或非对称密钥对程序集进行签名,该证书或密钥具有具有不安全程序集权限的相应登录名。或者,您可以使用sp_add_trusted_assembly信任该程序集

如何解决这个问题

  • EXEC sp_configure'显示高级选项','1';
    重新配置;
    
    没有/没有理由执行此命令。这真的没什么害处,但也没用

  • 错误消息清楚地说明了两种解决方法。请不要启用可信任的
    。这是一条更容易/更懒惰的路线,但当替代方案不难实施时,这是一个不需要打开的安全风险。有关
    值得信赖的问题的详细信息,请参阅:

  • 有关“CLR严格安全性”(在SQL Server 2017中引入)以及如何正确处理它的更多说明,请参阅我对以下问题的回答(见S.O.):

    基本概念如下(这是错误消息中说明的另一个选项):

  • 对程序集进行签名(使用强名称密钥(相当于SQL Server中的非对称密钥)或证书,或同时使用两者)。如果您是在Visual Studio中编译,那么“签名”(在项目属性下)意味着给它一个“强名称”(即不使用证书)
  • 在SQL Server中的
    [master]
    数据库中创建相应的公钥(强名称密钥==
    创建非对称密钥…
    ;证书==
    创建证书…
    )。现在,您可以从DLL文件中创建其中一个。如果此代码要进入生产环境,最好不要依赖DLL文件,因为这是对发布脚本的外部依赖。有两种方法可以完全自动化此过程,以下两篇文章介绍了这些选项:

  • 从非对称密钥或证书创建登录

  • 授予基于签名的登录
    不安全程序集
    权限
  • 现在,您可以在任何数据库中创建程序集,无需启用
    trustry
  • 最后创建T-SQL包装器对象

  • 有关一般使用SQLCLR的更多信息,请访问:

    SQL Server 2017上存在相同问题。通过执行简单脚本解决了此问题:

    EXEC sp_configure 'show advanced options', 1 
    RECONFIGURE; 
    EXEC sp_configure 'clr strict security', 0; 
    RECONFIGURE;
    
    SQL Server 2017引入了一个名为“CLR strict security”的新服务器级配置选项,并在默认情况下启用该选项的原因

    此选项要求使用证书或强名称密钥对所有程序集(即使是安全的程序集)进行签名。用于签名的证书(或非对称密钥)需要加载到[master]中,并从中创建登录名。此登录需要被授予不安全程序集权限


    您还应确认有关XProtect版本支持的SQL版本的系统要求,因为这表明您正在不受支持/未经测试的配置上运行。

    错误消息中给出了两种解决方案。您尝试了哪一个?通过阅读它所说的内容并遵循给出的建议:
    您使用证书或非对称密钥对程序集进行签名,该证书或密钥具有不安全的程序集权限的相应登录名。
    或者,如果这不适合您,作为替代方案,
    您可以使用sp\u add\u trusted\u assembly信任程序集。
    @AndrewMortonboth@TechGnome我试过了both@Lazar在问题中这样说是个好主意;)您尝试这些解决方案时是否有任何错误消息?