无法向数据库添加SQLCLR程序集,消息代码300。

7
我遇到了添加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
对象'server',数据库'master'上的不安全程序集权限被拒绝。

有什么想法?


这意味着您正在将该程序集添加到“master”数据库中。这正确吗? - Neil Knight
您使用的登录账户是否属于“sysadmin”角色? - a1ex07
@Neil Knight:这就是问题所在,我不知道为什么它会说“数据库'master'”。我使用了“USE [mydatabase]”,因为我正在尝试将程序集插入到“mydatabase”中。 - MStodd
如果指定PERMISSION_SET = UNSAFE,则需要成为sysadmin固定服务器角色的成员。 - Neil Knight
@NeilKnight和MStodd:不,错误信息并没有表明程序集被添加到“master”数据库中,那里只是保存和管理登录信息的地方,这是一个关于登录权限的服务器级别问题。此外,MSDN文档中的错误声明需要成为“sysadmin”角色的成员。将某人添加到该角色是非常糟糕的想法。所需的权限在错误信息中已经说明:“UNSAFE ASSEMBLY”。请参见我的答案获取完整细节 :)。 - Solomon Rutzky
3个回答

5

不要将登录添加到sysadmin固定服务器角色中,以解决此错误。这绝对是不必要的!

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

明确一下,这不是发帖者的错,因为他们正确引用了MSDN文档。问题在于CREATE ASSEMBLY的MSDN文档是不正确的。很遗憾, SQL Server 2008 R2的文档确实指出需要将登录添加到sysadmin服务器角色中。但是已经更正为以下内容:

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

这个权限UNSAFE ASSEMBLY,正是错误信息中所述的权限:

在对象'server'、数据库'master'上拒绝了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,我建议参考https://dev59.com/G1fUa4cB1Zd3GeqPK8Ow#38213540,其中有详细的解释。

2
这个答案是相当不正确的,但这并不是你的错,因为当时的MSDN文档是错误的。请参见我的答案了解详情。请还在此答案顶部放置一个注释,指导人们不要将登录添加到sysadmin服务器角色中,因为那是一个巨大的安全风险。 - Solomon Rutzky

0

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

ALTER DATABASE 数据库名称 SET TRUSTWORTHY ON;

来自BOL 因为连接到SQL Server实例的数据库不能立即被信任,所以在显式标记为可信之前,该数据库不允许访问超出数据库范围的资源。此外,旨在访问数据库外资源的模块和具有EXTERNAL_ACCESS和UNSAFE权限设置的程序集,需要满足额外的要求才能成功运行。


1
“TRUSTWORTHY”与此错误无关。问题中的错误消息指出了缺少的权限。“TRUSTWORTHY”应该仅在绝对必要时设置为“ON”,因为它是一种安全风险。 - Solomon Rutzky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接