Freigeben über


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 Instanz 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 einer Instanz von SQL Server befindet. Die Instanz von SQL Server wird auf Server A ausgeführt. Später fügen Sie diese Datenbank an eine Instanz 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, das über die external_access datenbank verfügt, die auf Server B gespeichert ist, wird die folgende Fehlermeldung angezeigt:

    Msg 10314, Ebene 16, Bundesland 11, Zeile 2
    Fehler im Microsoft .NET Framework beim Laden der Assembly-ID 65536. Auf dem Server sind möglicherweise nicht genügend Ressourcen verfügbar, oder die Assembly ist mit PERMISSION_SET = EXTERNAL_ACCESS oder UNSAFE nicht vertrauenswürdig. Führen Sie die Abfrage erneut aus, oder lesen Sie in der Dokumentation nach, wie Sie Probleme mit der Vertrauenswürdigkeit von Assemblys lösen. Weitere Informationen zu diesem Fehler:
    System.IO.FileLoadException: 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:
    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)

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

    Server: Msg 10327, Level 14, State 1, Line 1
    Fehler beim ERSTELLEN DER ASSEMBLY für assembly "AssemblyName", da assembly "AssemblyName" nicht für PERMISSION_SET = EXTERNAL_ACCESS autorisiert ist. Die Assembly ist autorisiert, wenn eine der folgenden Bedingungen zutrifft: Der Datenbankbesitzer (DBO) verfügt über die BERECHTIGUNG "EXTERNAL ACCESS ASSEMBLY", und die Datenbank verfügt über die VERTRAUENSWÜRDIGe Datenbankeigenschaft; oder die Assembly ist mit einem Zertifikat oder einem asymmetrischen Schlüssel signiert, der über eine entsprechende Anmeldung mit DER BERECHTIGUNG "EXTERNAL ACCESS ASSEMBLY" verfügt.

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

Ursache

Dieses Problem tritt auf, da die Anmeldung, die Sie zum Erstellen der Datenbank auf Server A verwenden, nicht in der Instanz von SQL Server auf Server B liegt. Diese Anmeldung kann entweder die Microsoft Windows-Anmeldung oder die SQL Server-Anmeldung sein.

Problemumgehung

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

Notiz

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'
    

    Notiz

    In dieser Anweisung <DatabaseName> ist ein Platzhalter des Namens der Datenbank, 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 BERECHTIGUNG CREATE ASSEMBLY verfügen, um eine Assembly zu erstellen.

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

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

Wenn es sich bei der Anmeldung um eine SQL Server-Anmeldung handelt, stellen Sie sicher, dass die SID dieser Anmeldung mit der neuen SQL Server-Anmeldung übereinstimmt, die Sie in der Instanz 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 auf das CLR-Objekt zugreifen und diese Datenbank über eine nicht übereinstimmende DBO-SID verfügt, kann das gleiche Problem auftreten.

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

References