Errore durante l'esecuzione di un oggetto CLR esistente o la creazione di un assembly

Questo articolo consente di risolvere due diversi problemi che possono verificarsi quando si usano oggetti CLR in un database spostato da un'istanza diversa di SQL Server.

Versione originale del prodotto: SQL Server
Numero KB originale: 918040

Sintomi

Considerate il seguente scenario: Si scollega o si esegue il backup di un database che si trova in un'istanza di SQL Server. L'istanza di SQL Server è in esecuzione nel server A. Successivamente, collegare o ripristinare il database a un'istanza di SQL Server in esecuzione nel server B. In questo scenario potrebbero verificarsi i sintomi seguenti:

  • Quando si tenta di eseguire un oggetto CLR (Common Language Runtime) esistente con il external_access set di autorizzazioni o unsafe dal database che si trova nel server B, viene visualizzato il messaggio di errore seguente:

    Msg 10314, Livello 16, Stato 11, Riga 2
    Si è verificato un errore in Microsoft .NET Framework durante il tentativo di caricare l'ID assembly 65536. Il server potrebbe esaurire le risorse o l'assembly potrebbe non essere considerato attendibile con PERMISSION_SET = EXTERNAL_ACCESS o UNSAFE. Eseguire di nuovo la query o controllare la documentazione per vedere come risolvere i problemi di attendibilità dell'assembly. Per altre informazioni su questo errore:
    System.IO.FileLoadException: impossibile caricare il file o l'assembly 'AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' o una delle relative dipendenze. Si è verificato un errore relativo alla sicurezza. (Eccezione da HRESULT: 0x8013150A) System.IO.FileLoadException:
    in System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) in System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) in System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) in System.Reflection.Assembly.Load(String assemblyString)

  • Quando si tenta di creare un nuovo assembly con l'autorizzazione external_access o unsafe impostata nello stesso database, viene visualizzato il messaggio di errore seguente:

    Server: Msg 10327, Livello 14, Stato 1, Riga 1
    CREATE ASSEMBLY per l'assembly 'AssemblyName' non riuscito perché l'assembly 'AssemblyName' non è autorizzato per PERMISSION_SET = EXTERNAL_ACCESS. L'assembly viene autorizzato quando si verifica una delle condizioni seguenti: il proprietario del database (DBO) dispone dell'autorizzazione EXTERNAL ACCESS ASSEMBLY e il database ha la proprietà di database TRUSTWORTHY in ; o l'assembly è firmato con un certificato o una chiave asimmetrica con un account di accesso corrispondente con l'autorizzazione EXTERNAL ACCESS ASSEMBLY.

I problemi si verificano anche se la proprietà del database è Trustworthy già stata impostata su ON.

Causa

Questo problema si verifica perché l'account di accesso usato per creare il database nel server A non è nell'istanza di SQL Server nel server B. Questo account di accesso può essere l'account di accesso di Microsoft Windows o l'account di accesso SQL Server.

Soluzione alternativa

Per risolvere questo problema, usare uno dei metodi seguenti.

Nota

Prima di usare i metodi seguenti, assicurarsi di abilitare la proprietà del Trustworthy database.

  • Utilizzare la sp_changedbowner stored procedure per modificare il proprietario del database in sa o in un account di accesso disponibile nel server B. Ad esempio, è possibile usare l'istruzione seguente per modificare il proprietario del database in sa:

    USE <DatabaseName>
    GO
    
    EXEC sp_changedbowner 'sa'
    

    Nota

    In questa istruzione <DatabaseName> è un segnaposto del nome del database su cui si sta lavorando. Il proprietario del database modificato deve avere le autorizzazioni corrispondenti per eseguire una determinata attività. Ad esempio, il proprietario del database deve disporre dell'autorizzazione CREATE ASSEMBLY per creare un assembly.

  • Aggiungere l'account di accesso nell'istanza di SQL Server nel server A usato per creare il database nell'istanza di SQL Server nel server B.

Se l'account di accesso è un account di dominio, è possibile creare lo stesso account di accesso nel server B. Concedere quindi le autorizzazioni necessarie all'account di accesso nell'istanza di SQL Server nel server B.

Se l'account di accesso è un account di accesso SQL Server, assicurarsi che il SID di questo account di accesso corrisponda al nuovo account di accesso SQL Server creato nell'istanza di SQL Server nel server B. A tale scopo, specificare l'argomento SID dell'istruzione CREATE LOGIN .

Ulteriori informazioni

Se si accede all'oggetto CLR da un database diverso e tale database presenta un SID DBO non corrispondente, può verificarsi lo stesso problema.

Per altre informazioni, visitare il blog seguente: CSS SQL Server Engineers.For more information, visit the following blog: CSS SQL Server Engineers.

Riferimenti