Kann ich die Tabellenstruktur in einer Transaktion ändern und im Fehlerfall zurücksetzen?

15

Ich habe einige ALTER TABLEAussagen, die ich laufe. Nicht alle von ihnen funktionieren (sie sind das Ergebnis der Ausführung von SQL Data Compare), und ich möchte sie in einigen Transaktionen gruppieren und die Anweisungen zurücksetzen, wenn etwas schief geht.

Ist dies möglich oder können nur Daten zurückgesetzt werden?

Piers Karsenbarg
quelle
Sprechen Sie über Redgate SQL Compare? Eine der Synchronisationsoptionen besteht darin, Transaktionen IIRC zu verwenden, sodass Sie sich das generierte Skript dort ansehen können, um den entsprechenden Code für die Kesselplatte zu sehen.
Martin Smith
Ja bin ich. Das werde ich mir mal ansehen.
Piers Karsenbarg

Antworten:

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
Pete Carter
quelle
3
Würde SET XACT_ABORT ONund ein letztes COMMIT TRANdie Notwendigkeit für die TRYBlöcke negieren ?
Luke Puplett
13

Ja, das ist möglich.

Die meisten DDL-Anweisungen können in SQL Server zurückgesetzt werden (es gibt einige Ausnahmen wie CREATE DATABASE)

Martin Smith
quelle
6

Viele Änderungen in einer Transaktion mit rollbackund commit- es ist kein Traum. Es ist möglich.

Hier ist ein Gerüst für Ihr Skript (nach MS-Richtlinien mit Verbesserungen):

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

Seien Sie vorsichtig, THROWfunktioniert nur für SQL Server - Version> 2012. Hier können Sie eine Version von konvertieren semver zu Jahr Notation : http://sqlserverbuilds.blogspot.ru (nicht bewusst .ruDomain gibt es eine englische Version)

maxkoryukov
quelle