本文可協助您解決在已從不同 SQL Server 實例行動之資料庫上使用 CLR 物件時可能發生的兩個不同的問題。
原始產品版本:SQL Server
原始 KB 編號: 918040
徵兆
請參考下列案例。 您可以卸離或備份 SQL Server 實例中的資料庫。 SQL Server 的實例正在伺服器 A 上執行。稍後,您會將該資料庫附加或還原至在伺服器 B 上執行的 SQL Server 實例。在此案例中,您可能會遇到下列徵兆:
當您嘗試從伺服器 B 的資料庫執行具有
external_access或 unsafe 許可權集的現有 Common Language Runtime (CLR) 物件時,您會收到下列錯誤訊息:訊息 10314,層級 16,狀態 11,第 2 行
嘗試載入元件標識碼 65536 時,Microsoft .NET Framework 中發生錯誤。 伺服器可能資源不足,或者組件具有 PERMISSION_SET = EXTERNAL_ACCESS 或 UNSAFE 而不受信任。 請再次執行查詢,或參閱文件集,以了解如何解決組件信任問題。 如需此錯誤的詳細資訊:
System.IO.FileLoadException:無法載入檔案或元件 'AssemblyName,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null' 或其其中一個相依性。 發生與安全性相關的錯誤。 (HRESULT 例外:0x8013150A)System.IO.FileLoadException:
at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& &stackMark, Boolean forIntrospection) at System.Reflection.Assembly.Load(String assemblyString)當您嘗試在相同資料庫中建立具有
external_access或 unsafe 許可權集的新元件時,您會收到下列錯誤訊息:伺服器:訊息 10327、層級 14、狀態 1、第 1 行
元件 'AssemblyName' 的 CREATE ASSEMBLY 失敗,因為元件 'AssemblyName' 未獲授權PERMISSION_SET = EXTERNAL_ACCESS。 當下列任一項為 true 時,即授權元件:資料庫擁有者 (DBO) 具有 EXTERNAL ACCESS ASSEMBLY 許可權,且資料庫具有 TRUSTWORTHY 資料庫屬性:或元件是使用憑證或具有具有 EXTERNAL ACCESS ASSEMBLY 許可權之對應登入的非對稱密鑰簽署。
即使您已經將資料庫屬性設定為 ON,Trustworthy也會發生問題。
原因
發生此問題的原因是您在伺服器 A 上用來建立資料庫的登入不在伺服器 B 上的 SQL Server 實例中。此登入可以是Microsoft Windows 登入或 SQL Server 登入。
因應措施
若要解決此問題,請使用下列其中一種方法。
注意
使用下列方法之前,請確定您啟用 Trustworthy 資料庫屬性。
sp_changedbowner使用預存程式將資料庫擁有者變更為 sa 或伺服器 B 上的可用登入。例如,您可以使用下列語句將資料庫擁有者變更為 sa:USE <DatabaseName> GO EXEC sp_changedbowner 'sa'注意
在此語句中,
<DatabaseName>是您要處理之資料庫名稱的佔位元。 已變更的資料庫擁有者應該具有執行特定工作的對應許可權。 例如,資料庫擁有者應該具有 CREATE ASSEMBLY 許可權,才能建立元件。在伺服器 A 上的 SQL Server 實例上新增登入,以將資料庫建立至伺服器 B 上的 SQL Server 實例。
如果登入是網域帳戶,您可以在伺服器 B 上建立相同的登入。然後將必要的許可權授與伺服器 B 上 SQL Server 實例上的登入。
如果登入是 SQL Server 登入,請確定此登入的 SID 符合您在伺服器 B 上 SQL Server 實例上建立的新 SQL Server 登入。若要這樣做,請指定 語句的 CREATE LOGIN SID 自變數。
其他相關資訊
如果您從不同的數據庫存取 CLR 物件,而且該資料庫有不相符的 DBO SID,就可能發生相同的問題。
如需詳細資訊,請流覽下列部落格: CSS SQL Server 工程師。