簡體   English   中英

獲取錯誤“回滾事務請求沒有相應的開始事務”

[英]Getting error “The rollback transaction request has no corresponding begin transaction”

我試圖創建一個觸發器,由於某種原因,第二個if語句破壞了我的代碼。

如果我刪除第二個if語句,代碼將起作用。 我得到的錯誤是:

回滾事務請求沒有相應的開始事務

我的代碼:

create trigger insertemployee 
on jobinsailing 
after insert 
as 

BEGIN TRANSACTION   

declare @sailingID        int, 
        @employeeID       char(9), 
        @jobTitle         varchar(10), 
        @sailingStartDate date, 
        @sailingEndDate   date 

select @sailingId = inserted.sailingid, 
       @employeeID = inserted.employeeid, 
       @jobTitle = inserted.jobtitle, 
       @sailingStartDate = sailing.leavingtime, 
       @sailingEndDate = sailing.returntime 
from   inserted 
       inner join sailing 
               on inserted.sailingid = sailing.sailingid 

if exists(select employeeid 
          from   sailing 
                 inner join jobinsailing 
                         on sailing.sailingid = jobinsailing.sailingid 
          where  ( @sailingStartDate <= returntime ) 
                 and ( leavingtime <= @sailingEndDate ) 
                 and employeeid = @employeeID) rollback TRANSACTION; 


else if exists((select sailing.sailingid 
          from   sailing 
                 inner join jobinsailing 
                         on jobinsailing.sailingid = sailing.sailingid 
          where  Datediff(day, @sailingStartDate, sailing.leavingtime) <= 4 
                  or Datediff(day, @sailingEndDate,sailing.leavingtime) <= 4 
                  or Datediff(day, @sailingStartDate,sailing.returntime) <= 4 
                  or Datediff(day, @sailingEndDate,sailing.returntime) <= 4
                  ))  rollback TRANSACTION;

COMMIT TRANSACTION

條件插入

您要實現的是使用觸發器有條件地將記錄插入表中。

這通常是一種糟糕的方法。 您的代碼(存儲過程和/或業務層代碼)應確定是否應在插入記錄之前插入記錄。 觸發器不是最好的工具 - 它們旨在允許您強制執行復雜的約束。

假設您必須使用觸發器,那么我建議您使用INSTEAD OF觸發器。 它們旨在覆蓋通常發生的默認插入過程,並允許您插入(或不插入)數據,而不必回滾事務。

多行插入

正如@DaleBurrell指出的那樣,每次插入操作都會執行一次觸發器,並且inserted表可以包含多行。 最佳做法是對觸發器進行編碼,使它們允許多行操作,但您也可以通過將此行添加到觸發器IF (ROWCOUNT_BIG() > 1) ROLLBACK的頂部來強制執行單行操作。

進一步閱讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM