Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł pomaga rozwiązać dwa różne problemy, które mogą wystąpić podczas pracy z obiektami CLR w bazie danych, która została przeniesiona z innego wystąpienia programu SQL Server.
Oryginalna wersja produktu: SQL Server
Oryginalny numer KB: 918040
Symptomy
Rozważmy następujący scenariusz. Należy odłączyć lub utworzyć kopię zapasową bazy danych, która znajduje się w wystąpieniu programu SQL Server. Wystąpienie programu SQL Server jest uruchomione na serwerze A. Później dołączysz lub przywrócisz bazę danych do wystąpienia programu SQL Server uruchomionego na serwerze B. W tym scenariuszu mogą wystąpić następujące objawy:
Podczas próby uruchomienia istniejącego obiektu środowiska uruchomieniowego języka wspólnego (CLR) z
external_accessbazą danych znajdującej się na serwerze B jest wyświetlany następujący komunikat o błędzie:Msg 10314, poziom 16, stan 11, wiersz 2
Wystąpił błąd w programie Microsoft .NET Framework podczas próby załadowania zestawu o identyfikatorze 65536. Serwer może brakować zasobów lub zestaw może nie być zaufany z PERMISSION_SET = EXTERNAL_ACCESS lub NIEBEZPIECZNY. Uruchom ponownie zapytanie lub sprawdź dokumentację, aby zobaczyć, jak rozwiązywać problemy z zaufaniem do zestawu. Aby uzyskać więcej informacji na temat tego błędu:
System.IO.FileLoadException: Nie można załadować pliku lub zestawu "AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" lub jednej z jego zależności. Wystąpił błąd związany z zabezpieczeniami. (Wyjątek od 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, EvidenceSecurity, StackCrawlMark& stackMark, Wartość logiczna forIntrospection) w: System.Reflection.Assembly.Load(String assemblyString)Podczas próby utworzenia nowego zestawu, który ma
external_accessustawione uprawnienia lub niebezpieczne w tej samej bazie danych, zostanie wyświetlony następujący komunikat o błędzie:Serwer: Msg 10327, Poziom 14, Stan 1, Wiersz 1
Tworzenie ZESTAWU dla zestawu "AssemblyName" nie powiodło się, ponieważ zestaw "AssemblyName" nie jest autoryzowany dla PERMISSION_SET = EXTERNAL_ACCESS. Zestaw jest autoryzowany, gdy jeden z następujących warunków ma wartość true: właściciel bazy danych (DBO) ma uprawnienie DO ZESTAWU DOSTĘPU ZEWNĘTRZNEgo, a baza danych ma właściwość ZAUFANEJ bazy danych; lub zestaw jest podpisany przy użyciu certyfikatu lub klucza asymetrycznego, który ma odpowiednie identyfikatory logowania z uprawnieniem ZESTAW DOSTĘPU ZEWNĘTRZNEgo.
Problemy występują nawet wtedy, gdy właściwość bazy danych jest już ustawiona Trustworthy na WŁ.
Przyczyna
Ten problem występuje, ponieważ identyfikator logowania używany do utworzenia bazy danych na serwerze A nie znajduje się w wystąpieniu programu SQL Server na serwerze B. Ten identyfikator logowania może być identyfikatorem logowania systemu Microsoft Windows lub identyfikatorem logowania programu SQL Server.
Rozwiązanie
Aby obejść ten problem, użyj jednej z następujących metod.
Uwaga 16.
Przed użyciem poniższych metod upewnij się, że właściwość bazy danych jest włączona Trustworthy .
sp_changedbownerUżyj procedury składowanej, aby zmienić właściciela bazy danych na sa lub na dostępną nazwę logowania na serwerze B. Na przykład możesz użyć następującej instrukcji, aby zmienić właściciela bazy danych na sa:USE <DatabaseName> GO EXEC sp_changedbowner 'sa'Uwaga 16.
W tej instrukcji
<DatabaseName>jest symbolem zastępczym nazwy bazy danych, nad którą pracujesz. Zmieniony właściciel bazy danych powinien mieć odpowiednie uprawnienia do wykonywania określonego zadania. Na przykład właściciel bazy danych powinien mieć uprawnienie CREATE ASSEMBLY do utworzenia zestawu.Dodaj identyfikator logowania w wystąpieniu programu SQL Server na serwerze A używanym do tworzenia bazy danych w wystąpieniu programu SQL Server na serwerze B.
Jeśli identyfikator logowania jest kontem domeny, możesz utworzyć to samo logowanie na serwerze B. Następnie przyznaj wymagane uprawnienia do logowania w wystąpieniu programu SQL Server na serwerze B.
Jeśli identyfikator logowania jest identyfikatorem logowania programu SQL Server, upewnij się, że identyfikator SID tego identyfikatora logowania jest zgodny z nowym identyfikatorem logowania programu SQL Server utworzonym w wystąpieniu programu SQL Server na serwerze B. W tym celu określ argument SID instrukcji CREATE LOGIN .
Więcej informacji
Jeśli uzyskujesz dostęp do obiektu CLR z innej bazy danych i że baza danych ma niezgodność identyfikatora SID DBO, może wystąpić ten sam problem.
Aby uzyskać więcej informacji, odwiedź następujący blog: INŻYNIEROWIE PROGRAMU SQL Server CSS.