Sql server CLR函数publish.sql文件

Sql server CLR函数publish.sql文件,sql-server,sql-server-2008-r2,sql-server-data-tools,sqlclr,Sql Server,Sql Server 2008 R2,Sql Server Data Tools,Sqlclr,我有一个CLR函数,我想使用permission\u set=safe 程序集使用公钥/私钥文件签名,我创建了一个非对称密钥,使用该非对称密钥创建了一个登录,并为该登录授予了不安全程序集的权限 如果我想部署程序集,我可以只执行在./bin/debug下找到的.publish.sql来部署CLR程序集.dll吗 提前感谢如果您已经设置了额外的东西,那么我很好奇您为什么不尝试执行该文件来亲自查看,因为这样可以回答这个问题,对吗?;-)但是,是的,要创建(并使用)标有权限\u SET=safe的程序集

我有一个CLR函数,我想使用
permission\u set=safe

程序集使用公钥/私钥文件签名,我创建了一个
非对称密钥
,使用该
非对称密钥
创建了一个
登录
,并为该登录授予了
不安全
程序集的权限

如果我想部署程序集,我可以只执行在./bin/debug下找到的.publish.sql来部署CLR程序集.dll吗


提前感谢

如果您已经设置了额外的东西,那么我很好奇您为什么不尝试执行该文件来亲自查看,因为这样可以回答这个问题,对吗?;-)但是,是的,要创建(并使用)标有
权限\u SET=safe的程序集,您只需执行这三个步骤

请记住,“发布”脚本始终是增量的。因此,您不应该将其视为在所有情况下都能工作的部署脚本。如果您已经完成了构建并且没有做任何更改,那么它将不会重新部署程序集,除非有一个总是删除并重新创建对象的选项(我知道数据库有,但不记得程序集有)。“创建”脚本,如果您选中了生成它的选项,总是会删除所有内容并重新创建


如果这是暗示的,默认情况下,SSDT生成的发布脚本不会与不属于项目的服务器级对象发生冲突(“项目的一部分”表示您已将
master
DB导入到解决方案中)。因此,完整的创建脚本不会(或至少不应该)从
[master]
中删除登录或非对称密钥。但是,如果需要,可以选择“不要删除登录”和/或“不要删除非对称密钥”

而且,由于这个问题涉及到较旧版本的SQL Server:刚刚发布的SQL Server 2017稍微更改了部署程序集的规则。问题中描述的方法仍然有效,因为它首先创建非对称密钥,但现在即使是
SAFE
程序集也需要这样做。我(详细地)描述了两种解决方案,即a)在SQL Server 2012的所有版本中工作,以及b)以完全自动化的方式使用Visual Studio框架和SSDT:

第一个链接(针对解决方案1)是对我为SQL Server Central编写的以下文章中详细介绍的方法的改编,该方法适用于SQL Server 2005-SQL Server 2016:


是的,如果发布配置配置配置正确(我的意思是不存在对CLR或smf的忽略)@DmitrijKultasev是否只需在SSMS中打开文件并单击“执行”即可?我不需要告诉它公钥/私钥在哪里。如果您不知道如何执行此操作,则不应该部署不安全的程序集。您可能不需要它们,例如您不应该尝试从SQLCLR发送电子邮件。或者使用它来加载CSV文件。或者执行查询。或其他应由SQL Server代理、SSI和外部工具执行的操作。任何浪费的RAM或CPU周期都是从服务器的内存和CPU资源中提取的,因此会造成损害performance@Cool_Br33ze这个组件是做什么的?为什么是SQLCLR程序集,为什么是不安全的?@PanagiotisKanavos使用.NET方法将GridRefs转换为LatLongs,反之亦然,
unsafe
,因为我发现在安全程序集中不允许存储到静态字段的错误。“SSDT生成的发布脚本不会与服务器级对象混淆”,这是错误的。您可以轻松地向项目添加登录名,等等。有一个选项可以启用/禁用它,最常见的是desabled@DmitrijKultasev没错,我只是泛指SQLCLR项目,因为这通常不会出现,因为这是在SSDT之外处理的。但是,我只是更新了我的答案来澄清。希望新的措辞更加准确。谢谢你指出这一点。