Bir işlemdeki tablo yapısını değiştirebilir ve bir hata varsa geri alabilir miyim?


15

Çalıştığım bazı ALTER TABLEifadeler var. Hepsi çalışmıyor (SQL Data Compare'i çalıştırmanın sonucudur) ve bazı işlemlerde onları gruplandırmak ve bir şeyler ters giderse ifadeleri geri almak istiyorum.

Bu mümkün mü, yoksa yalnızca geri alınabilecek veriler mi?


Redgate SQL Compare'den mi bahsediyorsunuz? Senkronizasyon seçeneklerinden biri, IIRC işlemlerini kullanmaktır, böylece bunun için bazı kazan plakası kodunu görmek için üretilen komut dosyasına bakabilirsiniz.
Martin Smith

Evet benim. Buna bir göz atacağım.
Piers Karsenbarg

Yanıtlar:


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
Misiniz SET XACT_ABORT ONve son bir COMMIT TRANinkâr ihtiyacı TRYblokları?
Luke Puplett

13

Evet, bu mümkün.

Çoğu DDL deyimi SQL Server'da geri alınabilir (gibi birkaç istisna vardır CREATE DATABASE)


6

Ve ile tek bir işlemde birçok değişiklikrollbackcommit - bu bir rüya değil. Bu mümkün.

İşte betiğiniz için bir iskele ( iyileştirmeler içeren MS yönergelerini izleyin ):

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

Dikkatli olun THROW> yalnızca SQL SERVER versiyonu için çalışır Burada 2012 tarihleri bir sürüm dönüştürmek olabilir semver için yıl gösterimi : http://sqlserverbuilds.blogspot.ru (farkında değil .ruetki, bir İngiliz versiyonu vardır)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.