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.