TSQL Создать триггер с транзакцией и попробовать блок catch - PullRequest
3 голосов
/ 28 июня 2010

У меня есть несколько вопросов о транзакции в триггере, на которые я еще не нашел ответа.

CREATE TRIGGER A_AI ON A
AFTER INSERT AS

    BEGIN TRY --is the try block 1 transaction ? or do I have to begin the transaction?

        --BEGIN TRAN: may I start the transaction like this?
        -- SOME DANGEROUS OPERATIONS

        COMMIT --has this sense here?
    END TRY
    BEGIN CATCH --silent catch no rasing errors.
        ROLLBACK TRANSACTION -- does it work without BEGIN TRANSACTION? if so, is it the whole try block?
    END CATCH

GO

1 Ответ

5 голосов
/ 28 июня 2010

Триггер всегда выполняется в контексте транзакции - каждый оператор DML работает внутри транзакции.Обычно это скрыто из-за того факта, что Неявные транзакции установлены на совершать автоматически в SQL Server.

Если вы выполняете откат из триггера, этобудет (как всегда с откатом) откатывать все транзакции, независимо от того, вложенные они или нет.

В общем случае вы не выполняете коммит в триггере, если (как в вашем закомментированном примере) вы не открываете вложенную транзакциюв явном виде.

Если у вашего вопроса есть другие аспекты, я не могу понять, что они собой представляют из вашего опубликованного примера.Хотя я всегда являюсь поклонником людей, публикующих реальный SQL при задании вопросов по SQL, иногда могут помочь небольшие комментарии или краткий список фактических вопросов.

...