創建 CLR 程序集時,程序集未授權 PERMISSION_SET=UNSAFE
執行所有這些命令的登錄名是
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
權限。你需要使用:
GRANT UNSAFE ASSEMBLY TO [clr_key1];
PS 您需要檢查您正在導入的兩個 DLL,以了解為什麼它們需要標記為
UNSAFE
. 如果是由於將值儲存在靜態變數中,那麼如果兩個會話同時執行此程式碼,則可能會導致意外結果。