Я реализовал триггер для таблицы, который гарантирует, что таблица не содержит более одной строки со значением 1 в битах в одном из ее столбцов.Но триггер почему-то не работает нормально.
create trigger [dbo].[flyingdutchman_needs_a_captain]
on [dbo].[flyingdutchman]
after insert, update, delete as
begin
set nocount on;
set rowcount 0;
begin try
declare @captainsum int
set @captainsum = 0
set @captainsum = (select sum(case when uniontable.iscaptain = 1 then 1 else 0 end)
from (
select iscaptain from dbo.flyingdutchman
union all
select inserted.iscaptain as iscaptain from inserted
union all
select deleted.iscaptain as iscaptain from deleted
) as uniontable
having sum(case when uniontable.iscaptain = 1 then 1 else 0 end) <> 1)
if(@captainsum <> 1)
begin
throw 50000,'flying dutchman is cursed and needs a captain.',1;
end
end try
begin catch
if xact_state()<>0
rollback transaction;
throw;
end catch
end
flyingdutchman - это таблица с тремя столбцами:
SailorId(int),SailorName(varchar),IsCaptain(bit)
и следующими строками:
При выполнении запроса:
insert into dbo.flyingdutchman(Sailorname,IsCaptain)
values('Davy Jones',1)
Я получаю сообщение об ошибке:
Msg 50000, Уровень 16, Состояние 1, Процедура FLYINGDUTCHMAN_NEEDS_A_CAPTAIN, Строка xx FLYING DUTCHMAN ИЗБРАНА И НУЖЕН КАПИТАН.
Я ожидаю, что этот запрос должен работать нормально, а триггер не должен запускаться.