Delen via


Fout bij het uitvoeren van een bestaand CLR-object of het maken van een assembly

Dit artikel helpt u bij het oplossen van twee verschillende problemen die kunnen optreden bij het werken met CLR-objecten in een database die is verplaatst van een ander exemplaar van SQL Server.

Oorspronkelijke productversie: SQL Server
Oorspronkelijk KB-nummer: 918040

Symptomen

Bekijk het volgende scenario. U ontkoppelt of maakt een back-up van een database die zich in een exemplaar van SQL Server bevindt. Het exemplaar van SQL Server wordt uitgevoerd op Server A. Later koppelt of herstelt u die database aan een exemplaar van SQL Server dat wordt uitgevoerd op Server B. In dit scenario kunnen de volgende symptomen optreden:

  • Wanneer u probeert een bestaand CLR-object (Common Language Runtime) uit te voeren met de external_access of onveilige machtigingenset van de database die zich op Server B bevindt, ontvangt u het volgende foutbericht:

    Msg 10314, Niveau 16, Staat 11, Regel 2
    Er is een fout opgetreden in Microsoft .NET Framework tijdens het laden van assembly-id 65536. De server heeft mogelijk onvoldoende resources of de assembly wordt mogelijk niet vertrouwd met PERMISSION_SET = EXTERNAL_ACCESS of ONVEILIG. Voer de query opnieuw uit of raadpleeg de documentatie om te zien hoe u problemen met de assemblyvertrouwensrelatie kunt oplossen. Voor meer informatie over deze fout:
    System.IO.FileLoadException: kan bestand of assembly 'AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' of een van de afhankelijkheden niet laden. Er is een fout opgetreden met betrekking tot beveiliging. (Uitzondering van 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, Booleaanse forIntrospection) bij System.Reflection.Assembly.Load(String assemblyString)

  • Wanneer u probeert een nieuwe assembly te maken waarvoor de external_access of onveilige machtigingen zijn ingesteld in dezelfde database, wordt het volgende foutbericht weergegeven:

    Server: Msg 10327, Niveau 14, Staat 1, Regel 1
    CREATE ASSEMBLY for assembly 'AssemblyName' is mislukt omdat assembly 'AssemblyName' niet is geautoriseerd voor PERMISSION_SET = EXTERNAL_ACCESS. De assembly is geautoriseerd wanneer een van de volgende beweringen waar is: de database-eigenaar (DBO) heeft de machtiging EXTERNAL ACCESS ASSEMBLY en de database heeft de eigenschap TRUSTWORTHY-database op; of de assembly is ondertekend met een certificaat of een asymmetrische sleutel met een bijbehorende aanmelding met de machtiging EXTERNAL ACCESS ASSEMBLY.

De problemen treden op, zelfs als u de Trustworthy database-eigenschap al hebt ingesteld op AAN.

Oorzaak

Dit probleem treedt op omdat de aanmelding die u gebruikt om de database op Server A te maken zich niet in het exemplaar van SQL Server op Server B bevindt. Deze aanmelding kan de Microsoft Windows-aanmelding of de SQL Server-aanmelding zijn.

Tijdelijke oplossing

Gebruik een van de volgende methoden om dit probleem te omzeilen.

Notitie

Voordat u de volgende methoden gebruikt, moet u ervoor zorgen dat u de Trustworthy database-eigenschap inschakelt.

  • Gebruik de sp_changedbowner opgeslagen procedure om de eigenaar van de database te wijzigen in sa of in een beschikbare aanmelding op Server B. U kunt bijvoorbeeld de volgende instructie gebruiken om de database-eigenaar te wijzigen in sa:

    USE <DatabaseName>
    GO
    
    EXEC sp_changedbowner 'sa'
    

    Notitie

    In deze instructie <DatabaseName> staat een tijdelijke aanduiding voor de naam van de database waaraan u werkt. De gewijzigde database-eigenaar moet over de bijbehorende machtigingen beschikken om een bepaalde taak uit te voeren. De eigenaar van de database moet bijvoorbeeld de machtiging ASSEMBLY MAKEN hebben om een assembly te maken.

  • Voeg de aanmelding toe aan het exemplaar van SQL Server op Server A dat wordt gebruikt om de database te maken bij het exemplaar van SQL Server op Server B.

Als de aanmelding een domeinaccount is, kunt u dezelfde aanmelding maken op Server B. Wijs vervolgens de vereiste machtigingen toe aan de aanmelding bij het exemplaar van SQL Server op Server B.

Als de aanmelding een SQL Server-aanmelding is, moet u ervoor zorgen dat de SID van deze aanmelding overeenkomt met de nieuwe SQL Server-aanmelding die u maakt op het exemplaar van SQL Server op Server B. Geef hiervoor het SID-argument van de CREATE LOGIN instructie op.

Meer informatie

Als u toegang hebt tot het CLR-object vanuit een andere database en die database een niet-overeenkomende DBO-SID heeft, kan hetzelfde probleem optreden.

Ga voor meer informatie naar de volgende blog: CSS SQL Server Engineers.

Verwijzingen