创建 CLR 程序集时,未授权程序集 PERMISSION_SET=UNSAFE

aje*_*jeh 4 sql-server compression sql-server-2012 sql-clr

运行所有这些命令的登录名是sysadminSQL 2012 Developer 实例上服务器角色的成员。它是部署到的数据库的所有者。EXTERNAL ACCESS ASSEMBLY已授予此 DB 中的登录权限。还尝试了以下所有内容作为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
Run Code Online (Sandbox Code Playgroud)

最后一个命令失败:

消息 10327,级别 14,状态 1,第 1 行 CREATE ASSEMBLY 为程序集“OutOfRowCompression”失败,因为程序集“OutOfRowCompression”未被授权用于 PERMISSION_SET = UNSAFE。当以下任一情况为真时,程序集被授权:数据库所有者 (DBO) 具有 UNSAFE ASSEMBLY 权限并且数据库具有 TRUSTWORTHY 数据库属性;或者程序集使用证书或非对称密钥签名,该密钥具有具有不安全程序集权限的相应登录名。

收到错误后,我使用新的非对称密钥对程序集进行了签名key1.pfx,并将其添加到主数据库中:

CREATE ASYMMETRIC KEY key1
FROM executable
FILE = 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
Run Code Online (Sandbox Code Playgroud)

验证密钥是否存在:

从此密钥创建登录并授予上帝模式:

create login clr_key1 from asymmetric key key1
go
GRANT EXTERNAL ACCESS ASSEMBLY TO clr_key1
go
Run Code Online (Sandbox Code Playgroud)

程序集创建命令仍然存在相同的错误。

尝试OutOfRowCompression在 Visual Studio 2012 中使用 SAFE 和 UNSAFE 访问构建程序集- 没有区别。

我觉得我已经满足了错误消息提出的所有要求。它应该工作。我错过了什么?

Sol*_*zky 7

你的GRANT说法是不正确的。您只授予了将程序集设置为EXTERNAL_ACCESS而非的能力UNSAFEUNSAFE受到的限制少于EXTERNAL_ACCESS,因此授予UNSAFE ASSEMBLY登录EXTERNAL ACCESS ASSEMBLY权限包括 - 隐式 -权限。

您需要使用:

GRANT UNSAFE ASSEMBLY TO [clr_key1];
Run Code Online (Sandbox Code Playgroud)

PS 您需要检查您正在导入的两个 DLL 为何需要将它们标记为UNSAFE. 如果是由于将值存储在静态变量中,那么如果两个会话同时执行此代码,则可能会导致意外结果。