T-SQL 中的 Windows 经过身份验证的用户需要什么访问权限才能创建 External_Access 或不安全程序集?

What access does a Windows authenticated user in T-SQL need to create an External_Access or Unsafe Assembly?

我正在尝试使用 Sqlclr 和 C# 进行 POC,以从存储过程调用 .Net 代码 (dll)。我正在尝试写入 EventLogs。我能够创建一个安全程序集,然后围绕我的 dll 创建一个存储过程包装器。但是在执行代码时它失败了——为了访问事件日志,需要使用 External_Access/ Unsafe 权限集创建程序集。

当我对外部组件进行同样的尝试时,它不起作用。所以我选择了从签名的 dll 创建登录的路线。

消息 300 - 对象 'server'、数据库 'master'

的外部访问程序集权限被拒绝

我的问题是我的 Windows 身份验证登录是否需要更多权限才能设置 External_Access 权限。是否需要 SA 帐户?

首先,您的意思是 运行 在 master 上执行此操作(根据错误消息)?

要使用 TRUSTWORTHY,用户需要 sysadmin 按照 here,但使用 TRUSTWORTHY 通常不是一个好主意。

要使用 EXTERNAL_ACCESS 创建程序集,登录需要对服务器有 EXTERNAL ACCESS ASSEMBLY 权限。要将程序集创建为 UNSAFE,登录需要对服务器具有 UNSAFE ASSEMBLY 权限。您可以阅读更多相关信息 here

尼尔斯

如果 SQL Server 2017 中与创建程序集相关的安全方面发生了相当大的变化,那么了解您正在使用的 SQL Server 版本将大有帮助.我写了一系列文章来解释 SQL Server 2017 中的总体问题,并提供了一些可以在 Visual Studio / SSDT:

中自动执行的解决方案

SQLCLR vs. SQL Server 2017, Part 1: “CLR strict security” – The Problem

第 1 部分主要是解释,而第 2 部分和第 3 部分是在这些限制条件下工作的两种方法。

  1. 如果您使用的是 SQL Server 2017,您是否尝试过授予基于非对称密钥的登录 UNSAFE ASSEMBLY 权限?
  2. 除了 GRANT EXTERNAL ACCESS ASSEMBLY 之外,您还为该登录做了其他事情吗?你DENY有什么事吗?
  3. 另一件事是将基于非对称密钥的登录添加到 sysadmin 固定服务器角色:

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [{LoginName}];
    

    虽然这 不应该 是必要的,但较旧的文档(2008 R2 及之前)声明这是一项要求。我从来不需要这样做,但值得测试,因为如果没有别的办法,它会让我们更接近实际问题。请务必在您将其变为 ON.

  4. 的数据库中将 TRUSTWORTHY 设置回 OFF

此外,您可能想查看我在 SQL Server Central 上撰写的系列文章,这些文章一般解释了使用 SQLCLR 的各个方面:

Stairway to SQLCLR