Получение ошибки «Запрос на транзакцию отката не имеет соответствующей начальной транзакции» - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь создать триггер и по какой-то причине второй оператор 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

1 Ответ

0 голосов
/ 30 апреля 2019

Условная вставка

Вы пытаетесь добиться условной вставки записей в таблицу с помощью триггера.

Как правило, это плохой подход.Ваш код (хранимые процедуры и / или код бизнес-уровня) должен определить, должна ли запись быть вставлена ​​первой перед ее вставкой.Триггеры - не лучший инструмент для этого - они предназначены для того, чтобы вы могли применять сложные ограничения.

Если предположить, что вы должны использовать триггеры, тогда я предлагаю вам использовать INSTEAD OF триггеры.Они предназначены для переопределения процесса вставки по умолчанию, который обычно происходит, и позволяют вставлять (или не вставлять) данные, а не выполнять откат транзакций.

Многострочная вставка

Как в @DaleBurrellКак указывалось выше, триггер выполняется один раз для каждой операции вставки, а таблица inserted может содержать несколько строк.Рекомендуется кодировать свои триггеры так, чтобы они допускали многострочные операции, но вы также можете принудительно выполнять однострочные операции, добавив эту строку в начало вашего триггера IF (ROWCOUNT_BIG() > 1) ROLLBACK.

Дальнейшее чтение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...