簡體   English   中英

在SQL Server 2008R2中引用簽名程序集

[英]Referencing Signed Assembly in SQL Server 2008R2

我有一些SSIS腳本任務中正在使用的C#.NET 3.5類庫(DLL),因此必須將其加載到GAC,這意味着必須對其進行簽名。 我創建了一個密鑰並簽名了DLL,它可以在SSIS中使用。

現在,我還想將此DLL加載到SQL Server,並創建一些CLR對象,這些對象引用此DLL中的類中的方法。 我有一個VS2012數據庫項目,並添加了對DLL的引用,將IsVisible和ModelAware屬性設置為true。 我擴展了UserDefinedFunctions類,以添加我的兩個在DLL中調用靜態方法的函數。

我的數據庫項目中的引用程序集和CLR對象都設置為SAFE因為它們除了數據庫中的內容外不需要任何東西。

該項目已構建,但是在發布到本地數據庫時出現此奇怪錯誤,但該項目失敗:

Creating [<<REFERENCED_DLL>>]...
Creating [<<CURRENT_DATABASE_CLR>>]...
(288,1): SQL72014: .Net SqlClient Data Provider: 
   Msg 6218, Level 16, State 2, Line 1 
   CREATE ASSEMBLY for assembly '<<CURRENT_DATABASE_CLR>>' failed
   because assembly '<<CURRENT_DATABASE_CLR>>' failed verification. 
   Check if the referenced assemblies are up-to-date and trusted 
   (for external_access or unsafe) to execute in the database.
   CLR Verifier error messages if any will follow this message
[ : UserDefinedFunctions::sf_Function1][mdToken=0x6000001][offset 0x00000005]
   Unable to resolve token.
[ : UserDefinedFunctions::sf_Function2][mdToken=0x6000002][offset 0x00000005] 
   Unable to resolve token.

瘋狂的是,如果我構建我的<<REFERENCED_DLL>>程序集並且不對其進行簽名,則該項目可以很好地發布並且功能可以按預期運行。 我嘗試對數據庫項目進行簽名,然后將AllowPartiallyTrustedCallers添加到引用的DLL。

我真的只想擁有一個可以在GAC和SQL Server中使用的DLL版本。 我怎樣才能做到這一點?

為了安全和穩定,SQLCLR只能訪問一小部分已批准的GAC程序集。 所有其他必須在數據庫中顯式注冊。

參見https://msdn.microsoft.com/zh-cn/library/ms403279(v=sql.105).aspx

SQL Server CLR僅允許從GAC加載以下內容:

CustomMarshalers
Microsoft.VisualBasic
Microsoft.VisualC
mscorlib
System
System.Configuration
System.Data
System.Data.OracleClient
System.Data.SqlXml
System.Deployment
System.Security
System.Transactions
System.Web.Services
System.Xml 

您是否已在數據庫中注冊了強密鑰?

  1. 如果主數據庫中不存在主密鑰,請創建一個:

    使用主

    通過密碼創建主密鑰加密='your_password';

  2. 在主數據庫中為強密鑰創建一個非對稱密鑰。 您需要將.snk文件復制到數據庫服務器,但是一旦注冊,就可以從服務器上將其刪除。

    從文件創建不對稱密鑰sqlkey ='path_to_the_strong_name_key';

  3. 從master數據庫中的非對稱密鑰創建登錄名。

    從不對稱密鑰yourkey創建登錄yourlogin;

  4. 提供您剛剛創建的登錄名的UNSAFE ASSEMBLY權限

    將不安全的組裝授予您的登錄名;

我更喜歡直接從Visual Studio發布,但是您應該可以這樣做。

 CREATE ASSEMBLY yourSQLCLR
 FROM 'C:\\yourSignedSQLCLR.dll' 
 WITH PERMISSION_SET = UNSAFE | SAFE |  EXTERNAL_ACCESS

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM