Posso modificare la struttura della tabella in una transazione e quindi ripristinarla in caso di errore?


15

Ho alcune ALTER TABLEdichiarazioni che sto correndo. Non tutti funzionano (sono il risultato dell'esecuzione di SQL Data Compare) e voglio raggrupparli in alcune transazioni e ripristinare le istruzioni se qualcosa va storto.

È possibile o sono solo i dati che è possibile ripristinare?


Stai parlando di Redgate SQL Compare? Una delle opzioni di sincronizzazione è quella di utilizzare le transazioni IIRC in modo da poter guardare lo script generato lì per vedere un po 'di codice della piastra della caldaia per questo.
— Martin Smith,

Sì, lo sono. Lo darò un'occhiata.
— Piers Karsenbarg,

Risposte:


10
   BEGIN TRANSACTION
      BEGIN TRY
        ALTER TABLE1...
        ALTER TABLE2...
        -- Additional data/structural changes
        COMMIT
      END TRY
      BEGIN CATCH
         ROLLBACK;
         THROW; -- Only if you want reraise an exception (to determine the reason of the exception)
      END CATCH

3
Sarebbe SET XACT_ABORT ONed una finale COMMIT TRANnega la necessità per i TRYblocchi?
— Luke Puplett,

13

Sì, questo è possibile.

La maggior parte delle istruzioni DDL può essere ripristinata in SQL Server (esistono alcune eccezioni come CREATE DATABASE)


6

Molte modifiche in una transazione con rollbacke commit- non è un sogno. È possibile.

Ecco un'impalcatura per il tuo script (seguendo le linee guida MS con miglioramenti):

BEGIN TRANSACTION

BEGIN TRY
    -- place your script in this TRY block

    -- your DDL instructions:
    ALTER TABLE1...
    ALTER TABLE2...
    -- data modifications:
    EXEC('
        UPDATE A
        SET    c1 = 23,
               c2 = ''ZZXX'';
    ');
    -- another DDL instruction:
    ALTER TABLE2...

    -- end of your script
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;


    -- If you want reraise an exception (to determine the reason of the exception)
    -- just uncomment block with appropriate version:

    -- SQL SERVER > 2012
    /*
    THROW;
    */

    -- SQL SERVER < 2012 (tested against 2008 R2)
    /*
    DECLARE @ErrorMessage VARCHAR(MAX);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    RAISERROR (
        @ErrorMessage, -- Message text.
        @ErrorSeverity, -- Severity.
        @ErrorState -- State.
    );
    */
END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
GO

Fai attenzione, THROWfunziona solo per la versione di SQL SERVER> 2012. Qui puoi convertire una versione da semest a notazione annuale : http://sqlserverbuilds.blogspot.ru (non sei a conoscenza del .rudominio, esiste una versione inglese)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.