Запретить вставку перекрывающихся диапазонов дат с помощью триггера SQL

У меня есть упрощенная таблица, которая выглядит так:

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

Важно : Если невозможно без идентичности - единственный ответ, я приветствую вас представить его вместе с разумным объяснением почему.

7
задан Robert Koritnik 26 October 2010 в 13:46
поделиться