Fehler beim Ausführen eines vorhandenen CLR-Objekts oder Erstellen einer Assembly

Dieser Artikel hilft Ihnen, zwei verschiedene Probleme zu beheben, die beim Arbeiten mit CLR-Objekten in einer Datenbank auftreten können, die aus einer anderen instance von SQL Server verschoben wurde.

Ursprüngliche Produktversion: SQL Server
Ursprüngliche KB-Nummer: 918040

Problembeschreibung

Stellen Sie sich folgendes Szenario vor: Sie trennen oder sichern eine Datenbank, die sich in einem instance SQL Server befindet. Die instance von SQL Server wird auf Server A ausgeführt. Später fügen Sie diese Datenbank an eine instance von SQL Server an, die auf Server B ausgeführt wird, oder stellen sie wieder her. In diesem Szenario können die folgenden Symptome auftreten:

  • Wenn Sie versuchen, ein vorhandenes CLR-Objekt (Common Language Runtime) auszuführen, für das die external_access -Berechtigung oder die unsichere Berechtigung für die Datenbank auf Server B festgelegt ist, wird die folgende Fehlermeldung angezeigt:

    Msg 10314, Ebene 16, Status 11, Zeile 2
    Fehler im Microsoft-.NET Framework beim Laden der Assembly-ID 65536. Auf dem Server sind möglicherweise keine Ressourcen vorhanden, oder die Assembly ist nicht mit PERMISSION_SET = EXTERNAL_ACCESS oder UNSAFE vertraut. Führen Sie die Abfrage erneut aus, oder lesen Sie die Dokumentation, um zu erfahren, wie Die Probleme mit der Assemblyvertrauensstellung gelöst werden. Weitere Informationen zu diesem Fehler:
    System.IO.FileLoadException: Die Datei oder Assembly "AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Ein Fehler im Zusammenhang mit der Sicherheit ist aufgetreten. (Ausnahme von HRESULT: 0x8013150A) System.IO.FileLoadException:
    bei 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) bei System.Reflection.Assembly.Load(String assemblyString)

  • Wenn Sie versuchen, eine neue Assembly zu erstellen, für die die external_access -Berechtigung oder die unsichere Berechtigung in derselben Datenbank festgelegt ist, wird die folgende Fehlermeldung angezeigt:

    Server: Msg 10327, Ebene 14, Status 1, Zeile 1
    Fehler bei CREATE ASSEMBLY für assembly "AssemblyName", da assembly "AssemblyName" nicht für PERMISSION_SET = EXTERNAL_ACCESS autorisiert ist. Die Assembly wird autorisiert, wenn einer der folgenden Punkte zutrifft: Der Datenbankbesitzer (DBO) verfügt über die EXTERNAL ACCESS ASSEMBLY-Berechtigung, und die Datenbank verfügt über die Datenbankeigenschaft TRUSTWORTHY; oder die Assembly ist mit einem Zertifikat oder einem asymmetrischen Schlüssel signiert, der über eine entsprechende Anmeldung mit external access assembly-Berechtigung verfügt.

Die Probleme treten auch dann auf, wenn Sie die Trustworthy Datenbankeigenschaft bereits auf ON festgelegt haben.

Ursache

Dieses Problem tritt auf, weil sich die Anmeldung, die Sie zum Erstellen der Datenbank auf Server A verwenden, nicht im instance von SQL Server auf Server B befindet. Bei dieser Anmeldung kann es sich entweder um den Microsoft Windows-Anmeldenamen oder um den SQL Server-Anmeldenamen handeln.

Problemumgehung

Verwenden Sie eine der folgenden Methoden, um dieses Problem zu umgehen.

Hinweis

Bevor Sie die folgenden Methoden verwenden, stellen Sie sicher, dass Sie die Trustworthy Datenbankeigenschaft aktivieren.

  • Verwenden Sie die sp_changedbowner gespeicherte Prozedur, um den Datenbankbesitzer in sa oder in eine verfügbare Anmeldung auf Server B zu ändern. Sie können beispielsweise die folgende Anweisung verwenden, um den Datenbankbesitzer in sa zu ändern:

    USE <DatabaseName>
    GO
    
    EXEC sp_changedbowner 'sa'
    

    Hinweis

    In dieser Anweisung ist ein Platzhalter für den Namen der Datenbank, <DatabaseName> an der Sie arbeiten. Der geänderte Datenbankbesitzer sollte über die entsprechenden Berechtigungen zum Ausführen einer bestimmten Aufgabe verfügen. Beispielsweise sollte der Datenbankbesitzer über die CREATE ASSEMBLY-Berechtigung verfügen, um eine Assembly zu erstellen.

  • Fügen Sie die Anmeldung auf der instance von SQL Server auf Server A hinzu, die zum Erstellen der Datenbank verwendet wird, zum instance von SQL Server auf Server B.

Wenn es sich bei der Anmeldung um ein Domänenkonto handelt, können Sie dieselbe Anmeldung auf Server B erstellen. Erteilen Sie dann die erforderlichen Berechtigungen für die Anmeldung auf dem instance von SQL Server auf Server B.

Wenn es sich bei der Anmeldung um einen SQL Server Anmeldenamen handelt, stellen Sie sicher, dass die SID dieses Anmeldenamens mit dem neuen SQL Server-Anmeldenamen übereinstimmt, den Sie auf dem instance von SQL Server auf Server B erstellen. Geben Sie dazu das SID-Argument der CREATE LOGIN Anweisung an.

Weitere Informationen

Wenn Sie von einer anderen Datenbank aus auf das CLR-Objekt zugreifen und diese Datenbank eine DBO-SID aufweist, die nicht übereinstimmt, kann das gleiche Problem auftreten.

Weitere Informationen finden Sie im folgenden Blog: CSS SQL Server Engineers.

References