【问题标题】:SQL Server 2017 Management Studio: CREATE ASSEMBLY errorSQL Server 2017 Management Studio:创建程序集错误
【发布时间】:2020-05-02 05:39:00
【问题描述】:

我在 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 行
使用 SAFE 或 EXTERNAL_ACCESS 选项为程序集“Database1”创建或更改程序集失败,因为 sp_configure 的“clr strict security”选项设置为 1。Microsoft 建议您使用具有相应登录名的证书或非对称密钥对程序集进行签名不安全组装许可。或者,您可以使用 sp_add_trusted_assembly 信任程序集。

如何解决?

【问题讨论】:

  • 错误信息中给出了两种解决方案。你试过哪一个?
  • 通过阅读它的内容并遵循给出的建议:you sign the assembly with a certificate or asymmetric key that has a corresponding login with UNSAFE ASSEMBLY permission. 或者,如果这不适合您,作为替代方案,you can trust the assembly using sp_add_trusted_assembly.
  • @AndrewMorton 两个
  • @TechGnome 我都试过了
  • @Lazar 在问题中这样说是个好主意;)您尝试这些解决方案时是否有任何错误消息?

标签: sql-server sqlclr


【解决方案1】:
  1. EXEC sp_configure 'show advanced option', '1';
    RECONFIGURE;
    

    没有/没有理由执行此命令。它确实没有伤害任何东西,但也没有任何用处。

  2. 错误消息清楚地说明了解决此问题的两个选项。请启用TRUSTWORTHY。这是更容易/更懒惰的路线,但是当替代方案不难实施时,这是不必要的安全风险。有关TRUSTWORTHY 相关问题的详细信息,请参阅:
    PLEASE, Please, please Stop Using Impersonation, TRUSTWORTHY, and Cross-DB Ownership Chaining

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

    CLR Strict Security on SQL Server 2017

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

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

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

    4. 授予基于签名的登录UNSAFE ASSEMBLY权限
    5. 现在您可以在任何数据库中创建程序集,并且无需启用TRUSTWORTHY
    6. 最后创建 T-SQL 包装对象

有关使用 SQLCLR 的更多信息,请访问:SQLCLR Info

【讨论】:

    【解决方案2】:

    在 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”的新服务器级配置选项的原因,并且默认启用。

    此选项要求所有程序集,甚至是 SAFE 程序集,都应使用证书或强名称密钥进行签名。用于进行签名的证书(或非对称密钥)需要加载到 [master] 并从中创建登录。反过来,此登录名需要被授予 UNSAFE ASSEMBLY 权限。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      相关资源
      最近更新 更多