Sql-Server

創建 CLR 程序集時,程序集未授權 PERMISSION_SET=UNSAFE

  • April 13, 2017

執行所有這些命令的登錄名是sysadminSQL 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,而不是UNSAFEUNSAFE的限制小於EXTERNAL_ACCESS,因此授予UNSAFE ASSEMBLYLogin 包括 - 隱式 -EXTERNAL ACCESS ASSEMBLY權限。

你需要使用:

GRANT UNSAFE ASSEMBLY TO [clr_key1];

PS 您需要檢查您正在導入的兩個 DLL,以了解為什麼它們需要標記為UNSAFE. 如果是由於將值儲存在靜態變數中,那麼如果兩個會話同時執行此程式碼,則可能會導致意外結果。

引用自:https://dba.stackexchange.com/questions/170956