运行所有这些命令的登录名是sysadmin
SQL 2012 Developer 实例上的服务器角色的成员。它是要部署到的数据库的所有者。EXTERNAL ACCESS ASSEMBLY
已授予此数据库中的登录权限。还尝试了以下所有sa
登录方式均无济于事。
alter database test set trustworthy on
go
create assembly [icsharpcode.sharpziplib]
from 'C:\Workspace\111\icsharpcode-SharpZipLib-4f2d664\bin\Release\ICSharpCode.SharpZipLib.dll'
with permission_set = UNSAFE --< This works!
go
create assembly OutOfRowCompression
from 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
with permission_set = UNSAFE --< This fails!
go
最后一个命令失败:
消息 10327,级别 14,状态 1,第 1 行为程序集“OutOfRowCompression”创建程序集失败,因为程序集“OutOfRowCompression”未获得 PERMISSION_SET = UNSAFE 的授权。当以下任一情况为真时,程序集被授权:数据库所有者 (DBO) 具有 UNSAFE ASSEMBLY 权限并且数据库具有 TRUSTWORTHY 数据库属性;或者程序集使用证书或非对称密钥签名,该密钥具有相应的登录名并具有 UNSAFE ASSEMBLY 权限。
收到错误后,我使用新的非对称密钥对程序集进行了签名并将key1.pfx
其添加到主数据库:
CREATE ASYMMETRIC KEY key1
FROM executable
FILE = 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
验证密钥是否存在:
从此密钥创建登录并授予上帝模式:
create login clr_key1 from asymmetric key key1
go
GRANT EXTERNAL ACCESS ASSEMBLY TO clr_key1
go
来自程序集创建命令的错误仍然相同。
尝试OutOfRowCompression
在 Visual Studio 2012 中使用 SAFE 和 UNSAFE 访问构建程序集 - 没有区别。
我觉得我已经满足了错误消息提出的所有要求。它应该工作。我错过了什么?
你的
GRANT
说法不正确。您只授予了将 Assemblies 设置为 的能力EXTERNAL_ACCESS
,而不是UNSAFE
。UNSAFE
的限制小于EXTERNAL_ACCESS
,因此授予UNSAFE ASSEMBLY
Login 包括 - 隐式 -EXTERNAL ACCESS ASSEMBLY
权限。你需要使用:
PS 您需要检查您正在导入的两个 DLL,以了解为什么它们需要标记为
UNSAFE
. 如果是由于将值存储在静态变量中,那么如果两个会话同时执行此代码,则可能会导致意外结果。