【问题标题】:CLR Function publish.sql fileCLR 函数 publish.sql 文件
【发布时间】:2018-03-29 02:44:50
【问题描述】:

我有一个 CLR 函数,我想使用 permission_set = unsafe 进行部署

程序集使用公钥/私钥文件进行签名,我创建了一个assymtric key,使用该asymmetric key 创建了一个login,并授予了unsafe 程序集的登录权限

如果我想部署程序集,是否可以只执行 ./bin/debug 下的 .publish.sql 来部署 CLR 程序集 .dll?

提前致谢

【问题讨论】:

  • 是的,如果发布配置配置正确,您可以(我的意思是没有像这样忽略 CLR 或 smf)
  • @DmitrijKultasev 是不是像在SSMS中打开文件然后点击执行一样简单?我不需要告诉它公钥/私钥在哪里。
  • 如果您不知道如何执行此操作,则不应该部署不安全的程序集。您可能不需要它们,例如您不应该尝试从 SQLCLR 发送电子邮件。或者使用它来加载 CSV 文件。或执行查询。或任何其他应由 SQL Server 代理、SSIS、外部工具执行的操作。任何浪费的 RAM 或 CPU 周期都会从服务器的内存和 CPU 资源中获取,从而损害性能
  • @Cool_Br33ze 这个程序集是做什么的?为什么是 SQLCLR 程序集以及为什么不安全?
  • @PanagiotisKanavos 使用 .NET 方法将 GridRefs 转换为 LatLongs,反之亦然,Unsafe 因为我收到错误在安全程序集中不允许存储到静态字段

标签: sql-server sql-server-2008-r2 sql-server-data-tools sqlclr


【解决方案1】:

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

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

为了防止这是暗示,默认情况下,SSDT 生成的发布脚本不会与不属于项目的服务器级对象混淆(“项目的一部分”意味着您已导入 @ 987654325@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:

Stairway to SQLCLR Level 7: Development and Security

【讨论】:

  • “SSDT 生成的发布脚本不会与服务器级对象混淆”这不是真的。您可以轻松地将登录名添加到项目等。有一个启用/禁用它的选项,最常见的是禁用它
  • @DmitrijKultasev 没错,我只是笼统地谈论 SQLCLR 项目,因为这通常不会出现,因为这是在 SSDT 之外处理的。但是,我刚刚更新了我的答案以澄清。希望新的措辞更准确。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多