我正在尝试(学习)使用 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 受信任。
我做错了什么?
需要明确的是,“启用 clr”
sp_configure
通常是实例级别的,而不是数据库级别的配置。哎呀。好吧,关于 MSSQLTips 的那篇文章比您遇到的错误更成问题。如果您忘记在那篇文章中看到的所有内容并且再也没有看过它,那将是最好的。它充满了不好的建议:
SqlString
而不是String
输入参数类型(和返回类型)msdb
? 也许只有我一个人,但我永远不会将代码部署到msdb
(而且我只会在master
物理需要时添加代码,例如将 proc 标记为启动 proc 或系统 proc 时)。UNSAFE
权限集?为什么?对于电子邮件?大会应该是EXTERNAL_ACCESS
. 代码(程序集、登录名、用户或其他任何内容)不应被授予超出必要的权限。TRUSTWORTHY ON
是msdb
两个问题之一:TRUSTWORTHY ON
是懒惰的。当然,可以进行概念验证/快速测试,但这不是一个好的长期/生产级选项。这是一个巨大的安全风险。相反,应该使用模块签名。这是我为如何完成此操作编写的指南,并在 Visual Studio 中执行此操作:SQLCLR 与 SQL Server 2017,第 2 部分:“CLR 严格安全”-解决方案 1
TRUSTWORTHY
已经ON
为msdb
。至少它是ON
默认的。@body
参数应该是NVARCHAR(MAX)
,不是NVARCHAR(4000)
。毕竟,这是 HTML 电子邮件(即myMessage.IsBodyHtml = True
)您实际发布到哪个数据库?假设您要发布到另一个不是 的数据库
msdb
,那么您至少简单地说,在这一刻要继续前进,需要为TRUSTWORTHY ON
您要发布到的数据库进行设置。但同样,启用TRUSTWORTHY
只是为了测试(请参阅:请、请、请停止使用模拟、可信和跨数据库所有权链接)。现在,如果您
ALTER DATABASE...
手动执行,然后在发布时仍然出现错误,那么很可能您选择了“部署数据库属性”选项(在 Visual Studio 中:转到“项目属性”|“调试”选项卡 |“部署选项" 底部的区域)。TRUSTWORTHY
是这些数据库属性之一。因此,当检查“部署数据库属性”时,每个部署都将设置选项以匹配项目中定义的内容。并且默认情况下Trustworthy
是不启用的。您的选择是:
如果要部署数据库属性:
要在 Visual Studio 中启用
Trustworthy
(用于部署):转到“项目属性”| “项目设置”选项卡 | “数据库设置...”按钮 | “其他”选项卡。选中“可信赖”复选框,然后单击“确定”按钮。如果您不部署数据库属性:
TRUSTWORTHY
在部署程序集的数据库中启用可信赖(启用msdb
不会有帮助)一旦你在开发中正常工作,在推送到生产之前正确处理安全性:
SQLCLR 与 SQL Server 2017,第 2 部分:“CLR 严格安全性” - 解决方案 1
要了解更多关于 SQLCLR 的一般信息,请访问:SQLCLR 信息。请务必查看“Stairway to SQLCLR”链接,这是我在 SQL Server Central 上就该主题撰写的系列文章。