У меня есть упрощенная таблица, которая выглядит так:
create table Test
(
ValidFrom date not null,
ValidTo date not null,
check (ValidTo > ValidFrom)
)
Я хотел бы написать триггер, предотвращающий вставку значений, которые перекрывают существующий диапазон дат. Я написал триггер, который выглядит так:
create trigger Trigger_Test
on Test
for insert
as
begin
if exists(
select *
from Test t
join inserted i
on ((i.ValidTo >= t.ValidFrom) and (i.ValidFrom <= t.ValidTo))
)
begin
raiserror (N'Overlapping range.', 16, 1);
rollback transaction;
return
end;
end
Но он не работает, так как моя недавно вставленная запись является частью обеих таблиц Test и вставленных внутри триггера. . Таким образом, новая запись во вставленной таблице всегда присоединяется к самой себе в тестовой таблице. Триггер всегда отменяет преобразование.
Я не могу отличить новые записи от существующих. Поэтому, если бы я исключил одни и те же диапазоны дат, я мог бы вставить в таблицу несколько точно таких же диапазонов.
Можно ли написать триггер, который работал бы должным образом, без добавления дополнительного столбца идентификаторов в мою тестовую таблицу, который я мог бы использовать для исключения вновь вставленных записей из моей exists ()
, например:
create trigger Trigger_Test
on Test
for insert
as
begin
if exists(
select *
from Test t
join inserted i
on (
i.ID <> t.ID and /* exclude myself out */
i.ValidTo >= t.ValidFrom and i.ValidFrom <=t.ValidTo
)
)
begin
raiserror (N'Overlapping range.', 16, 1);
rollback transaction;
return
end;
end
Важно : Если невозможно без идентичности - единственный ответ, я приветствую вас представить его вместе с разумным объяснением почему.