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.