Casper-SC
@Casper-SC
.NET программист

В запросе пишем в несколько таблиц. Если в первую данные записались, а при записи во вторую вылетело исключение, то запись в первую откатится?

При этом в запросе используется такая конструкция:
DECLARE @first SMALLINT 
    SET @first = 0

    IF (NOT EXISTS(SELECT ........))
    BEGIN
        IF(EXISTS(SELECT ........))
            SET @first = 0
        ELSE
            SET @first = 1

        BEGIN TRY
            INSERT INTO {0}
            ([ID])
            OUTPUT  INSERTED.ID)
            VALUES (@Id)

            INSERT INTO {2} (ID], [CONTENT])
            VALUES (@Id, @Content)

            IF @first = 1
            BEGIN
		        ALTER TABLE {0}
			        WITH CHECK ADD CONSTRAINT CK_{0}_{3}_{4}
                CHECK( ... ) 
                OR ( ... ))

                UPDATE TABLES SET BEGIN_INDEX_{3} = {1} WHERE NAME_TABLE = '{0}'
            END
        END TRY
        BEGIN CATCH
            declare @ErrorNumber int
            select @ErrorNumber = ERROR_NUMBER()
            IF @ErrorNumber not in (2601, 2627)
            BEGIN
                declare @ErrorMessage nvarchar(max), @ErrorSeverity int, @ErrorState int;
                select @ErrorMessage = cast(@ErrorNumber as nvarchar) + ' ' + ERROR_MESSAGE() + ' Line ' + cast(ERROR_LINE() as nvarchar(5)), 
                        @ErrorSeverity = ERROR_SEVERITY(), 
                        @ErrorState = ERROR_STATE();
                RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)
            END
        END CATCH
    END
  • Вопрос задан
  • 349 просмотров
Решения вопроса 2
Winsik
@Winsik
сис.админ, недопрограммист :)
если открыть транзакцию то конечно
то есть открываете транзакцию , все обновления в трайблок и если ошибка делаете ролбэк, если всё хорошо то коммит
Ответ написан
@dmitryKovalskiy
программист средней руки
Для длинного списка операций последовательность действий примерно такая
BEGIN TRY
BEGIN TRANSACTION
DO SOMETHING...
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TranCount >0
ROLLBACK TRANSACTION
END CATCH


Без подтверждения или отката транзакций никаких откатов происходить не будет. Отработают инструкции до возникновения ошибки и останутся в базе.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы