當您執行現有 CLR 物件或建立元件時發生錯誤

當您在已從不同的 SQL Server 實例移動的資料庫上使用 CLR 物件時,本文會協助您解決兩個不同的問題。

原始產品版本:   Sqlserver
原始 KB 編號:   918040

徵狀

請考慮下列案例。 您拔出或備份 SQL Server 實例中的資料庫。 SQL Server 實例正在伺服器 A 上執行。稍後,您可以將該資料庫附加或還原至伺服器 B 上執行的 SQL Server 實例。在此案例中,您可能會遇到下列的情況:

  • 當您嘗試執行現有的公共語言執行時間時 (CLR) 物件具有 external_access 伺服器 B 上的資料庫中的或不安全的許可權集時,您會收到下列錯誤訊息:

    Msg 10314,Level 16,State 11,第2列
    嘗試載入元件識別碼65536時,Microsoft .NET Framework 發生錯誤。 伺服器可能會耗盡資源,或可能無法使用 PERMISSION_SET = EXTERNAL_ACCESS 或不安全所信任的元件。 請再次執行查詢,或查看檔,以瞭解如何解決元件信任問題。 如需此錯誤的詳細資訊:
    FileLoadException:無法載入檔案或彙編 ' AssemblyName,Version = 0.0.0.0,Culture = 中立性,PublicKeyToken = null ' 或其其中一個相依性。 發生與安全性相關的錯誤。 HRESULT: 0x8013150A) FileLoadException 的 (例外狀況:
    在 System.Reflection。 nLoad (AssemblyName fileName,String codeBase,證據 assemblySecurity,Assembly locationHint,StackCrawlMark& stackMark,Boolean throwOnFileNotFound,Boolean forIntrospection) 于 System.Reflection。 Assembly. InternalLoad (AssemblyName assemblyRef,證據 assemblySecurity,StackCrawlMark& stackMark,Boolean forIntrospection) ,System.Reflection (字串 InternalLoad&

  • 當您嘗試在 external_access 相同的資料庫中建立具有或不安全許可權集的新元件時,會收到下列錯誤訊息:

    伺服器: Msg 10327,Level 14,State 1,第1列
    建立元件 "AssemblyName" 失敗,因為元件 "AssemblyName" 未獲授權 PERMISSION_SET = EXTERNAL_ACCESS。 當下列任一項為真時,即會授權元件:資料庫擁有者 (DBO) 具有外部存取元件許可權,且資料庫具有「信任的資料庫」屬性。或使用具有對應之 [外部存取元件] 許可權的憑證或非對稱金鑰簽署元件。

即使您已將「 信任 的資料庫」屬性設定為 [ 開啟],也會發生問題。

原因

發生此問題的原因是,您用來在伺服器 A 上建立資料庫的登入不在伺服器 B 上的 SQL Server 實例中。這種登入可能是 Microsoft Windows 登入或 SQL Server 登入。

因應措施

若要解決此問題,請使用下列其中一種方法。

注意

在您使用下列方法之前,請先確定啟用 [信任的資料庫] 屬性。

  • 使用 sp_changedbowner 預存程式,將資料庫擁有者變更為 sa 或伺服器 B 上的可用登入。例如,您可以使用下列語句將資料庫擁有者變更為 sa

    USE <DatabaseName>
    GO
    
    EXEC sp_changedbowner 'sa'
    

    注意

    在此語句中, <DatabaseName> 是您正在使用之資料庫名稱的預留位置。 已變更的資料庫擁有者應具備執行特定工作的對應許可權。 例如,資料庫擁有者應具備建立元件的「建立元件」許可權。

  • 在伺服器 A 上的 SQL Server 實例上新增登入,用來建立資料庫至伺服器 B 上的 SQL Server 實例。

如果登入是網域帳戶,您可以在伺服器 B 上建立相同的登入。然後將所需的許可權授與伺服器 B 上的 SQL Server 實例上的登入。

如果登入是 SQL Server 登入,請確定此登入的 SID 符合您在伺服器 B 上的 SQL Server 實例上建立的新 SQL Server 登入。若要這麼做,請指定該語句的 SID 引數 CREATE LOGIN

詳細資訊

如果您從不同的資料庫存取 CLR 物件,且該資料庫的 DBO SID 不一致,就會發生相同的問題。

如需詳細資訊,請流覽下列博客: CSS SQL Server 工程師

參考