我在将 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
UNSAFE ASSEMBLY permission was denied on object 'server', database 'master'.
想法?
最佳答案
请不要向 sysadmin
固定服务器角色添加登录名,以避免出现此错误。完全没有必要!
接受的答案是不正确的,不是因为它不起作用(它确实起作用),而是因为不需要将整个实例的完全控制权授予登录名,只是为了执行有特定权限的操作。您不会仅仅为了授予 Windows 登录域管理员对特定共享或文件夹的删除权限而将其设置为域管理员。
需要明确的是,这不是发布者的错,因为他们正确引用了 MSDN 文档。问题在于 CREATE ASSEMBLY
的 MSDN 文档不正确。 documentation for SQL Server 2008 R2不幸的是,确实声明登录必须位于sysadmin
服务器角色中。然而,it has since been corrected声明:
If PERMISSION_SET = UNSAFE is specified, requires UNSAFE ASSEMBLY permission on the server.
此权限,UNSAFE ASSEMBLY
,与错误消息中所述的权限完全相同:
UNSAFE ASSEMBLY permission was denied on object 'server', database 'master'
意思是,所需要做的就是执行以下操作(一次):
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]
数据库中的原因是,此权限是服务器级别的权限,而不是数据库级别的权限,需要应用于登录(存在于服务器级别),而不是用户(存在于数据库级别)。
这就是为什么错误消息引用对象'server'
(因为它是服务器级权限)和数据库'master'
(因为登录存在于[master]
数据库,并且仅当查询的当前数据库设置为 [master]
时才能修改。
我已经使用登录进行了测试,当尝试加载标记为 WITH PERMISSION_SET = UNSAFE
的程序集时,该登录会收到问题中显示的错误消息(即 Msg 300
) >。然后,我授予了 UNSAFE ASSEMBLY
权限,并且登录能够加载 UNSAFE
程序集;不需要(甚至尝试过)任何sysadmin
成员(member)资格。我对此进行了测试:SQL Server 2005 SP4、SQL Server 2008 R2 RTM 和 SQL Server 2012 SP3。
关于sql-server - 无法将 SQLCLR 程序集添加到数据库,Msg 300,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6190301/