Уникальные поля диапазона дат в SQL Server 2008

Разве Вы не можете вызвать функцию MapPath прежде, чем запустить таймер, и просто кэшировать результат? Действительно ли абсолютно необходимо сделать, чтобы MapPath звонил в событии галочки?

5
задан marc_s 14 December 2009 в 06:05
поделиться

3 ответа

Триггер ниже должен сработать - это также можно сделать с помощью контрольных ограничений, но логика, показанная в этом посте , как бы болит мне голову.

CREATE TRIGGER [dbo].[DateRangeTrigger]
   ON  [dbo].[TargetTable]
   FOR INSERT, UPDATE
AS 
BEGIN

IF EXISTS (SELECT t.starttime, t.endtime FROM TargetTable t
        Join inserted i
        On (i.starttime > t.starttime AND i.starttime < t.endtime AND i.UniqueId <> t.UniqueId) 
           OR (i.endtime < t.endtime AND i.endtime > t.starttime AND i.UniqueId <> t.UniqueId)
           OR (i.starttime < t.starttime AND i.endtime > t.endtime AND i.UniqueId <> t.UniqueId)
        )
BEGIN
    RAISERROR ('Inserted date was within invalid range', 16, 1)
    IF (@@TRANCOUNT>0)
        ROLLBACK
END


END
5
ответ дан 13 December 2019 в 19:28
поделиться

Этот триггер также будет работать в ситуациях, когда один временной интервал полностью содержит другой. Например, если существует запись для 6:00 - 9:00, и вы пытаетесь вставить ее для 5:00 - 10:00.
(На основе ответа Дэвида Холла)

CREATE TRIGGER DateRangeOverlapTrigger
ON  TargetTable
FOR INSERT, UPDATE
AS 
BEGIN
IF EXISTS
    (SELECT t.UniqueId
    FROM TargetTable t
        JOIN inserted i ON i.starttime < t.endtime
            AND i.endtime > t.starttime
            AND i.UniqueId <> t.UniqueId)
BEGIN
    RAISERROR ('Invalid due to time overlap', 16, 1)
    IF (@@TRANCOUNT > 0)
        ROLLBACK
END
END
2
ответ дан 13 December 2019 в 19:28
поделиться

Я не пробовал, но думаю, что-то вроде этого сработает:

create trigger preventOverlaps
on infotable
FOR Insert, Update
As
DECLARE @Count int;
select @Count = count(*) from infotable where 
  (inserted.startdate > startDate && inserted.startdate < endDate) ||
  (inserted.endDate < endDate && inserted.endDate > startDate)
if(@Count > 0)
begin
   rollback transaction;
end
4
ответ дан 13 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: