Condividi tramite


L'aggiornamento di SQL Server non riesce con codice di errore 574 durante l'esecuzione di script di database di aggiornamento

Questo articolo consente di risolvere e risolvere un problema per cui un aggiornamento cumulativo (CU) o Service Pack (SP) per SQL Server segnala l'errore 574 durante l'esecuzione di script di aggiornamento del database.

Sintomi

Quando si applica un CU o SP, il programma di installazione potrebbe segnalare l'errore seguente:

Attesa dell'handle di recupero del Motore di database non riuscita. Controllare il log degli errori di SQL Server per individuare le possibili cause.

Quando si esamina il log degli errori di SQL Server, è possibile notare i messaggi di errore seguenti:

Error: 574, Severity: 16, State: 0.
CONFIG statement cannot be used inside a user transaction.
Error: 912, Severity: 21, State: 2.
Script level upgrade for database 'master' failed because upgrade step 'sqlagent100_msdb_upgrade.sql' encountered error 574, state 0, severity 16.
This is a serious error condition which might interfere with regular operation and the database will be taken offline.
If the error happened during upgrade of the 'master' database, it will prevent the entire SQL Server instance from starting.
Examine the previous errorlog entries for errors, take the appropriate corrective actions and re-start the database so that the script upgrade steps run to completion.
Error: 3417, Severity: 21, State: 3.
Script level upgrade for database 'master' failed because upgrade step 'msdb110_upgrade.sql' encountered error 15173, state 1, severity 16

Causa

Il processo di aggiornamento può eseguire alcuni script di aggiornamento all'interno di una transazione. Questi script di aggiornamento sono progettati con un presupposto che gli utenti non apportano modifiche agli oggetti di sistema e alle autorizzazioni associate. Se si apportano inavvertitamente modifiche a oggetti o autorizzazioni di sistema, alcuni di questi script potrebbero non riuscire e la transazione associata può diventare orfana e rimanere aperta. In questo scenario, quando il programma di installazione esegue successivamente uno script di aggiornamento che usa sp_configure per impostare alcuni valori di configurazione, si verifica l'errore 574. La causa effettiva dell'errore di installazione deve essere determinata esaminando le voci registrate prima dell'errore 574.

Ad esempio, uno script simile al seguente può causare l'errore 574:

BEGIN TRAN
USE MASTER;
GO
EXEC sp_configure 'recovery interval', '4';
RECONFIGURE WITH OVERRIDE;
COMMIT TRAN

Risoluzione

Per risolvere il problema, seguire questa procedura:

  1. Avviare SQL Server con il flag di traccia 902. Per altre informazioni, vedere Passaggi per avviare SQL Server con il flag di traccia 902.

  2. Aprire il log degli errori di SQL Server ed esaminare i messaggi precedenti all'errore 574 per identificare la transazione non riuscita (vedere il modello di esempio seguente).

  3. Correggere la transazione non riuscita in base alle informazioni contenute nella sezione Possibili cause e soluzioni .

  4. Rimuovere il flag di traccia 902 dall'elemento Parametri di avvio e riavviare SQL Server.

    Dopo l'avvio di SQL Server senza flag di traccia 902, lo script di aggiornamento verrà eseguito di nuovo.

    • Se lo script di aggiornamento di SP/CU viene completato correttamente, è possibile controllare il log degli errori di SQL Server e la cartella bootstrap per verificare.
    • Se lo script di aggiornamento non riesce di nuovo, controllare la presenza di altri errori nel log degli errori di SQL Server e risolvere i nuovi errori.

Modello di esempio: Problemi di concessione delle autorizzazioni al ruolo di sistema

2020-08-17 09:38:12.09 spid11s Adding user 'hostname\svc_sqlagent' to SQLAgentUserRole msdb role...
2020-08-17 09:38:12.09 spid11s
2020-08-17 09:38:12.09 spid11s Granting login access'##MS_SSISServerCleanupJobLogin##' to msdb database...
2020-08-17 09:38:12.10 spid11s A problem was encountered granting access to MSDB database for login '(null)'. Make sure this login is provisioned with SQLServer and rerun sqlagent_msdb_upgrade.sql
2020-08-17 09:38:12.10 spid11s A problem was encountered granting access to MSDB database for login '(null)'. Make sure this login is provisioned with SQLServer and rerun sqlagent_msdb_upgrade.sql
2020-08-17 09:38:12.10 spid11s
2020-08-17 09:38:12.10 spid11s Adding user '##MS_SSISServerCleanupJobLogin##' to SQLAgentUserRole msdb role...

Possibili cause e soluzioni

  • Le opzioni utente causano l'esito negativo delle transazioni.

    Soluzione: connettersi a SQL Server, usare la documentazione dell'opzione di configurazione del server opzioni utente per identificare le opzioni che potrebbero causare il problema e rimuovere l'impostazione in conflitto.

    Ad esempio, il supporto Tecnico Microsoft ha rilevato istanze in cui l'impostazione per IMPLICIT_TRANSACTIONS causa l'esito negativo dell'installazione. In alternativa, se non è possibile identificare l'opzione utente in conflitto, rimuovere tutte le opzioni utente usando lo script seguente in SQL Server Management Studio (SSMS):

    EXEC sp_configure 'user options', '0'
    GO
    RECONFIGURE WITH OVERRIDE;
    GO
    
  • Gli utenti orfani causano l'esito negativo delle transazioni.

    Soluzione: verificare la presenza di utenti orfani usando una query simile alla seguente:

    SELECT dp.type_desc, dp.SID, dp.name AS user_name
    FROM sys.database_principals AS dp
    LEFT JOIN sys.server_principals AS sp
         ON dp.SID = sp.SID
    WHERE sp.SID IS NULL
         AND authentication_type_desc = 'INSTANCE';
    

    Per altre informazioni su come risolvere gli utenti orfani, vedere Risolvere i problemi relativi agli utenti orfani (SQL Server).

  • I processi orfani causano l'esito negativo delle transazioni.

    Soluzione: verificare la presenza di processi orfani usando una query simile alla seguente:

    SELECT sj.name AS Job_Name,
         sl.name AS Job_Owner
    FROM msdb.dbo.sysjobs_view sj
    LEFT JOIN master.dbo.syslogins sl ON sj.owner_sid = sl.sid
    WHERE sl.name <> 'sa'
    ORDER BY sj.name
    

    Qualsiasi record che mostra un valore NULL indica che il proprietario del processo dell'agente applicabile è orfano. Modificare il processo e modificare il proprietario in un account di accesso valido.