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

MSt*_*odd 7 sql-server permissions sqlclr sql-server-2008

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

这是我的代码:

USE [mydatabase]
GO

CREATE ASSEMBLY [My.Assembly]
AUTHORIZATION [dbo]
FROM 'C:\Program Files\MyStuff\My.Assembly.dll'
WITH PERMISSION_SET = UNSAFE
GO
Run Code Online (Sandbox Code Playgroud)

这是我的错误:

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

思考?

Sol*_*zky 5

请不要没有一个登录添加到sysadmin为了得到过去的这个错误固定服务器角色.绝对没有必要!

接受的答案是不正确的,不是因为它不起作用(它确实如此),而是因为没有必要在整个登录过程中给予完全控制以执行具有特定权限的操作.您不会将Windows登录设置为域管理员,只是为了给予他们对特定共享或文件夹的删除权限.

要清楚,这不是海报的错,因为他们正确引用了MSDN文档.问题是MSDN文档CREATE ASSEMBLY不正确.不幸的是,SQL Server 2008 R2文档确实指出Login必须是sysadmin服务器角色.但是,它已被纠正为:

如果指定了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
Run Code Online (Sandbox Code Playgroud)

要么:

USE [master];
GRANT UNSAFE ASSEMBLY TO [sql_login_name];  -- for SQL Server Logins
Run Code Online (Sandbox Code Playgroud)

您需要在[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.


a1e*_*x07 2

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

更新

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

  • 这个答案是完全不正确的,尽管不是你的错,因为当时的 MSDN 文档是不正确的。有关详细信息,请参阅我的[答案](http://stackoverflow.com/a/38213540/577765)。还请在此答案的顶部添加注释,指示人们不要将登录添加到“sysadmin”服务器角色,因为这是一个巨大的安全风险。 (2认同)