Точки сохранения в триггерах - PullRequest
0 голосов
/ 03 июля 2019

У меня есть 3 таблицы, скажем, Таблица A, Таблица B и Таблица C.

У меня есть триггер для таблицы A, который вставляет данные в таблицу B, и у меня также есть триггер для таблицы b, который вводитданные в Таблицу C. В Таблице C есть триггер, который выполняет процедуру.

Задача состоит в том, что даже если что-то происходит во время операций в Таблице C, т. е. (происходит любая ошибка), операции в Таблице A, B и C должны продолжаться и завершаться.Проблема в том, что если что-то пойдет не так в процедурах, то операции с таблицами A, B и C также будут прерваны.

Мой триггер таблицы C:

CREATE TRIGGER [dbo].[Trg_Mst_TableC] 
ON [dbo].[TableC]
FOR UPDATE 
AS 
BEGIN
    DECLARE @flg_Error INT
    SET @flg_Error  = 0

    DECLARE @SLQString NVARCHAR(MAX) 

    SELECT @SLQString  = 'Text Message' 

    SAVE TRANSACTION MySavePoint                                    

    IF ISNULL(@SLQString, '') <> '' 
    BEGIN 
        EXEC spMsc_SendMsg 'Test', 'POST',  @SLQString

        IF @@error <> 0 BEGIN 
            ROLLBACK TRAN MySavePoint
        END 
    END
END

Вот моя процедура:

CREATE PROCEDURE [dbo].[spMsc_SendMsg]  
     @msg_type NVARCHAR(50),  
     @getpost NVARCHAR(20),  
     @msg_txt NVARCHAR(MAX)  
AS  
BEGIN  
    SET NOCOUNT ON 

    SAVE TRANSACTION MySavePoint

    CREATE TABLE Test (XXX NVARCHAR(MAX))

    SELECT @msg_type, @getpost, @msg_txt
END   

Теперь эта процедура возвращает сообщение об ошибке для таблицы «Тест».Но мне нужно сохранить оставшуюся транзакцию до Триггера С. Пожалуйста, дайте мне решение для этого.

1 Ответ

0 голосов
/ 03 июля 2019

Вместо использования Транзакций и Откатов вы можете использовать блоки TRY CATCH для контроля того, что вы хотите случиться, если в конкретном триггере произойдет ошибка.

...