【问题标题】:Cannot add a SQLCLR assembly to database, Msg 300无法将 SQLCLR 程序集添加到数据库,消息 300
【发布时间】:2011-09-05 15:02:23
【问题描述】:

我在将 SQLCLR 程序集添加到数据库中时遇到问题,但我的一位同事没有问题。尽管我们确实有不同级别的访问权限,但我们无法弄清楚为什么我会收到我收到的错误消息。

这是我的代码:

USE [mydatabase]
GO

CREATE ASSEMBLY [My.Assembly]
AUTHORIZATION [dbo]
FROM 'C:\Program Files\MyStuff\My.Assembly.dll'
WITH PERMISSION_SET = UNSAFE
GO

这是我的错误:

消息 300,第 14 级,状态 1,第 3 行
对象“服务器”、数据库“主服务器”上的不安全组件权限被拒绝。

想法?

【问题讨论】:

  • 这表明您正在将程序集添加到master 数据库。这是正确的吗?
  • 你使用的登录名是sysadmin角色的成员吗?
  • @Neil Knight:这就是问题所在,我不知道为什么它说“数据库'master'”。我有 'USE [mydatabase]' 因为我试图将程序集插入到 'mydatabase'
  • 如果指定了PERMISSION_SET = UNSAFE,则需要sysadmin固定服务器角色的成员身份。
  • @NeilKnight 和 MStodd:不,错误消息并不表明程序集被添加到 master DB,这只是登录和管理的地方,这是一个问题登录的服务器级权限。此外,这是一个 MSDN 文档错误,指出需要 sysadmin 角色的成员身份。将某人添加到该角色是一个非常糟糕的主意。错误消息中说明了所需的权限:UNSAFE ASSEMBLY。详情请查看我的answer :)。

标签: sql-server sql-server-2008 permissions sqlclr


【解决方案1】:

不要添加登录到sysadmin 固定服务器角色,以克服此错误。完全没有必要!

接受的答案是不正确的,不是因为它不起作用(它确实起作用),而是因为没有必要将整个实例的完全控制权授予登录名,只是为了做一些有特定权限的事情。您不会仅仅为了授予他们对特定共享或文件夹的删除权限而使 Windows 登录成为域管理员。

需要明确的是,这不是发帖者的错,因为他们确实正确引用了 MSDN 文档。问题是 CREATE ASSEMBLY 的 MSDN 文档不正确。不幸的是,documentation for SQL Server 2008 R2 确实声明登录必须位于sysadmin 服务器角色中。但是,it has since been corrected 声明:

如果指定了 PERMISSION_SET = UNSAFE,则需要服务器上的 UNSAFE ASSEMBLY 权限。

此权限UNSAFE ASSEMBLY 与错误消息中所述的权限完全相同:

对象“服务器”、数据库“主服务器”上的不安全组件权限被拒绝

意思是,只需要执行以下操作(一次):

USE [master];
GRANT UNSAFE ASSEMBLY TO [AD_domain_name\windows_login_name]; -- for Windows Logins

或:

USE [master];
GRANT UNSAFE ASSEMBLY TO [sql_login_name];  -- for SQL Server Logins

您需要在[master] 数据库中的原因是此权限是服务器级别,而不是数据库级别,需要应用于登录(存在于服务器级别)的权限,而不是用户(存在于数据库级别)。

这就是为什么错误消息引用object 'server'(因为它是服务器级别的权限)和database 'master'(因为登录存在于[master]数据库中并且只能在当前数据库进行查询时修改设置为[master])。

我已经使用登录名对此进行了测试,当尝试加载标记为WITH PERMISSION_SET = UNSAFE 的程序集时,会收到问题中显示的错误消息(即Msg 300)。然后我授予UNSAFE ASSEMBLY 权限,并且登录能够加载UNSAFE 程序集;不需要(甚至尝试过)sysadmin 成员资格。我在 SQL Server 2005 SP4、SQL Server 2008 R2 RTM 和 SQL Server 2012 SP3 上进行了测试。

【讨论】:

    【解决方案2】:

    我认为您有问题,因为登录不是sysadmin 的成员。 MSDN 说,“如果指定了 PERMISSION_SET = UNSAFE,则需要 sysadmin 固定服务器角色的成员身份”

    更新

    正如评论中提到的,它可以而且应该在不将登录名分配给 sysadmin 角色的情况下完成。不幸的是,我不能删除这个答案,因为它被接受了,所以如果有人仍然有 SQLServer 2008 ,我建议参考http://stackoverflow.com/a/38213540/577765 有详细解释

    【讨论】:

    • 这个答案是完全不正确的,虽然不是你的错,因为当时的 MSDN 文档是不正确的。详情请看我的answer。还请在此答案的顶部放置一条注释,指示人们将登录名添加到sysadmin 服务器角色,因为这是一个巨大的安全风险。
    【解决方案3】:

    您是否更改了数据库属性以设置可信任?

    ALTER DATABASE 数据库名称 SET TRUSTWORTHY ON;

    来自 BOL 由于无法立即信任附加到 SQL Server 实例的数据库,因此在数据库被明确标记为可信任之前,不允许该数据库访问超出数据库范围的资源。此外,设计用于访问数据库外部资源的模块以及具有 EXTERNAL_ACCESS 和 UNSAFE 权限设置的程序集需要额外的要求才能成功运行。

    【讨论】:

    • TRUSTWORTHY 与此错误无关。问题中的错误消息说明缺少什么权限。 TRUSTWORTHY 不应设置为 ON,除非绝对必要,因为这是安全风险。
    猜你喜欢
    • 2015-11-09
    • 2011-12-22
    • 2018-09-30
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多