Czy mogę zmienić strukturę tabeli w transakcji, a następnie wycofać ją, jeśli wystąpi błąd?


15

Mam kilka ALTER TABLEinstrukcji, które uruchamiam. Nie wszystkie z nich działają (są wynikiem uruchomienia porównywania danych SQL) i chcę je zgrupować w niektórych transakcjach i wycofać instrukcje, jeśli coś pójdzie nie tak.

Czy to możliwe, czy to tylko dane, które można przywrócić?


Mówisz o Redgate SQL Compare? Jedną z dostępnych opcji synchronizacji jest użycie transakcji IIRC, abyś mógł spojrzeć na wygenerowany skrypt tam, aby zobaczyć do tego kod płyty kotłowej.
Martin Smith,

Tak, jestem. Spojrzę na to.
Piers Karsenbarg

Odpowiedzi:


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
Czy SET XACT_ABORT ONi ostatecznie COMMIT TRANneguje potrzebę TRYbloków?
Luke Puplett

13

Tak, jest to możliwe.

Większość instrukcji DDL można wycofać w programie SQL Server (istnieje kilka wyjątków, takich jak CREATE DATABASE)


6

Wiele alterings w jednej z transakcji rollbacki commit- to nie jest sen. To jest możliwe.

Oto rusztowanie skryptu (zgodnie z wytycznymi MS z ulepszeniami):

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

Bądź ostrożny, THROWdziała tylko dla wersji SQL SERVER> 2012. Tutaj możesz przekonwertować wersję z zapisu semver na rok : http://sqlserverbuilds.blogspot.ru (nie wiesz o .rudomenie, istnieje wersja angielska)


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.