2015-06-26 3 views
0

У меня есть требование вызвать процедуру в триггере, который вызовет еще несколько транснациональных процедур. Как убедиться, что все транзакции являются откатами, если какая-либо из процедур не выполнена. БлагодаряОткат всех транзакций в триггере

CREATE PROCEDURE dbo.PROC2(@pi_row INT) 
AS 
BEGIN 
    UPDATE TABLE abc SET col1 = @pi_row 
END 
GO 

CREATE PROCEDURE dbo.PROC1(@pi_row INT) 
AS 
BEGIN 
    UPDATE TABLE xyz SET col1 = @pi_row 
    EXEC dbo.PROC1 @pi_row 
END 
GO 

CREATE TRIGGER test_insert ON xyz 
    FOR INSERT 
AS 
    BEGIN 
    DECLARE @pi_row int; 

    SELECT @pi_row = rownumber 
    FROM deleted; 

    EXEC dbo.proc1 @pi_row; 
    END; 
GO 
+0

где PROC2 называется? –

+0

Используйте начальный tran и end tran в SP, где вы вызываете все остальные SP. – Azar

ответ

2

это может помочь: -

CREATE PROCEDURE dbo.PROC2(@pi_row INT) 
AS 
BEGIN 
    UPDATE TABLE abc SET col1 = @pi_row 
END 
GO 

CREATE PROCEDURE dbo.PROC1(@pi_row INT) 
AS 
BEGIN 

    Declare @TransName Varchar(100) = 'PIRowUpdation' 

    Begin Tran @TransName 

    UPDATE TABLE xyz SET col1 = @pi_row 
    If @@Error <> 0 Goto Error 

    EXEC dbo.PROC2 @pi_row 
    If @@Error <> 0 Goto Error 

    Commit Tran @TransName 
    Goto LevelEnd 

Error: 
    Rollback Tran @TransName 

LevelEnd: 


END 
GO 
+0

Лучше ли использовать «фиксацию» в триггере? – Steven

+0

@Steven, я могу сказать, что это одна из хорошей практики совершения транзакции. Я не администратор базы данных, поэтому я не могу сказать о лучшей практике. –

Смежные вопросы