我在将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权限。
思想?
答案 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权限设置的程序集还有其他要求才能成功运行。