AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 227619
Accepted
McNets
McNets
Asked: 2019-01-21 14:18:22 +0800 CST2019-01-21 14:18:22 +0800 CST 2019-01-21 14:18:22 +0800 CST

使用 Visual Studio 2017 发布 SQLCLR C# 函数时出错

  • 772

我正在尝试(学习)使用 Visual Studio 2017 发布 SQLCLR 函数。(这是一个发送电子邮件的简单函数。)

作为参考,我在CodeProject和MSSQLTips上使用了这篇文章:

使用 Visual Studio 2013 数据库项目创建、运行、调试和部署 SQL CLR 函数

使用 CLR 存储过程从 SQL Server Express 发送电子邮件

在项目属性-> SQLCLR 我已经设置:

Permission level : UNSAFE

根据文章,我更新了目标数据库:

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

在我得到错误之后,我在 MSSQLTips 文章中遵循了这个建议:

如果在尝试编译代码时收到错误消息,您可能需要使用以下命令更改数据库,然后再次尝试创建程序集和存储过程。

ALTER DATABASE msdb SET trustworthy ON

我尝试过使用两个不同的目标数据库:

  • SQL-Server 2017 本地数据库
  • SQL-Server 2017 速成版

我可以毫无错误地构建项目,但是当我发布项目时,我在执行下一个命令时收到一个错误:

CREATE ASSEMBLY [dbSysmac]
    AUTHORIZATION [dbo]
    FROM 0x5F8A900003000000...
    WITH PERMISSION_SET = UNSAFE;

(47,1):SQL72014:.Net SqlClient 数据提供程序:消息 10327,级别 14,状态 1,第 1 行为程序集“dbSysmac”创建程序集失败,因为程序集“dbSysmac”不受信任。当以下任一情况为真时,程序集是受信任的:程序集使用证书或非对称密钥签名,该密钥具有相应的登录名并具有 UNSAFE ASSEMBLY 权限,或者程序集使用 sp_add_trusted_assembly 受信任。

我做错了什么?

sql-server c#
  • 1 1 个回答
  • 1528 Views

1 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2019-01-21T23:12:02+08:002019-01-21T23:12:02+08:00

    我已经更新了目标数据库:

     sp_configure 'clr enabled', 1;
    

    需要明确的是,“启用 clr”sp_configure通常是实例级别的,而不是数据库级别的配置。

    我在 MSSQLTips 文章上遵循了这个建议

    哎呀。好吧,关于 MSSQLTips 的那篇文章比您遇到的错误更成问题。如果您忘记在那篇文章中看到的所有内容并且再也没有看过它,那将是最好的。它充满了不好的建议:

    1. 在 SQL Server Express 中发送电子邮件不需要 SQLCLR (我已经对此进行了测试,它确实有效)。但是,它在 SQL Server Express LocalDB 中不起作用:-(
    2. 您应该使用SqlString而不是String输入参数类型(和返回类型)
    3. 部署到msdb? 也许只有我一个人,但我永远不会将代码部署到msdb(而且我只会在master物理需要时添加代码,例如将 proc 标记为启动 proc 或系统 proc 时)。
    4. UNSAFE权限集?为什么?对于电子邮件?大会应该是EXTERNAL_ACCESS. 代码(程序集、登录名、用户或其他任何内容)不应被授予超出必要的权限。
    5. 设置TRUSTWORTHY ON是msdb两个问题之一:
      1. 设置TRUSTWORTHY ON是懒惰的。当然,可以进行概念验证/快速测试,但这不是一个好的长期/生产级选项。这是一个巨大的安全风险。相反,应该使用模块签名。这是我为如何完成此操作编写的指南,并在 Visual Studio 中执行此操作:
        SQLCLR 与 SQL Server 2017,第 2 部分:“CLR 严格安全”-解决方案 1
      2. TRUSTWORTHY已经ON为msdb。至少它是ON默认的。
    6. 输入@body参数应该是NVARCHAR(MAX),不是NVARCHAR(4000)。毕竟,这是 HTML 电子邮件(即myMessage.IsBodyHtml = True)
    7. 不,绝对不要将您的纯文本电子邮件密码存储在 .NET 代码中。DLL / 程序集未加密。所有字符串都按原样存储在 EXE / DLL / 程序集的末尾。显示程序集的内容几乎不费吹灰之力,如果您遵循此建议,您的 SMTP 服务器、登录名和密码将被存储以供任何人查看。要么从变量中传递它们,要么执行简单的查询以从表中进行选择。您甚至可以从 Windows 注册表中获取它们。

    您实际发布到哪个数据库?假设您要发布到另一个不是 的数据库msdb,那么您至少简单地说,在这一刻要继续前进,需要为TRUSTWORTHY ON您要发布到的数据库进行设置。但同样,启用TRUSTWORTHY只是为了测试(请参阅:请、请、请停止使用模拟、可信和跨数据库所有权链接)。

    现在,如果您ALTER DATABASE...手动执行,然后在发布时仍然出现错误,那么很可能您选择了“部署数据库属性”选项(在 Visual Studio 中:转到“项目属性”|“调试”选项卡 |“部署选项" 底部的区域)。TRUSTWORTHY是这些数据库属性之一。因此,当检查“部署数据库属性”时,每个部署都将设置选项以匹配项目中定义的内容。并且默认情况下Trustworthy是不启用的。

    您的选择是:

    1. 如果要部署数据库属性:

      要在 Visual Studio 中启用Trustworthy(用于部署):转到“项目属性”| “项目设置”选项卡 | “数据库设置...”按钮 | “其他”选项卡。选中“可信赖”复选框,然后单击“确定”按钮。

    2. 如果您不部署数据库属性:

      TRUSTWORTHY在部署程序集的数据库中启用可信赖(启用msdb不会有帮助)

    3. 一旦你在开发中正常工作,在推送到生产之前正确处理安全性:

      SQLCLR 与 SQL Server 2017,第 2 部分:“CLR 严格安全性” - 解决方案 1

    要了解更多关于 SQLCLR 的一般信息,请访问:SQLCLR 信息。请务必查看“Stairway to SQLCLR”链接,这是我在 SQL Server Central 上就该主题撰写的系列文章。

    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve