无法将SQLCLR程序集添加到数据库,Msg 300

时间:2011-05-31 15:59:31

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

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

这是我的代码:

USE [mydatabase]
GO

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

这是我的错误:

  

Msg 300,Level 14,State 1,Line 3
  对象'服务器',数据库'master'上拒绝了UNSAFE ASSEMBLY权限。

思想?

3 个答案:

答案 0 :(得分:5)

请执行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是错误消息中所述的确切权限:

  

对象'服务器',数据库'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])。

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

答案 1 :(得分:2)

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

<强>更新

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

答案 2 :(得分:0)

您是否更改过数据库属性以设置值得信任?

ALTER DATABASE Databasename SET TRUSTWORTHY ON;

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