Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / триггер / 3 сообщений из 3, страница 1 из 1
02.08.2002, 13:10:54
    #32040587
guest
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер
Существует таблица period (id_period, date_from, date_to, name, type_period)
Необходимо создать триггер, проеряющий правильность ввода периодов планирования. Иными словами,
нельзя допускать ситуацию, при которой в таблице period существуют записи с
одним и тем же типом периода (type_period = 'year', 'month', 'quarter'), но с перекрывающимися
диапазонами дат.
Т.е не допустимо:
1 квартал с 01/01/2001 по 30/03/2002
2 квартал с 30/03/2002 по ...

Нижеприведенный триггер вроде бы должен работать, но
при добавлении новой даты в любом случае возврат откат по RAISERROR.

CREATE TRIGGER test
ON period
FOR INSERT, UPDATE
AS
DECLARE @RetCode int
SET @RetCode = 50001

IF EXISTS (
SELECT * FROM inserted INS, period PR
WHERE EXISTS( SELECT * FROM period PR, inserted INS WHERE
NOT (INS.name = PR.name) AND INS.type_period = PR.type_period ) AND

-- условие пересечения диапазонов дат
(
(INS.date_from <= PR.date_from AND INS.date_to > PR.date_from) OR
(INS.date_from >= PR.date_from AND INS.date_from < PR.date_to) OR
(INS.date_to > PR.date_from AND INS.date_to <= PR.date_to)
)
)

BEGIN ROLLBACK TRANSACTION
RAISERROR @RetCode 'Диапазоны дат не могут пересекаться!'
END
RETURN
...
Рейтинг: 0 / 0
02.08.2002, 13:25:02
    #32040592
Александр Степанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер
И правильно вываливается! Дело в том, что триггер срабатывает ПОСЛЕ вставки записей в таблицу period, поэтому ВСЕ записи из таблицы INSERTED уже присутствуют в таблице PERIOD.

Таким образом если в таблице PERIOD есть primary key (например, PK), то ваш код должен выглядеть следующим образом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE TRIGGER test 
ON period 
FOR INSERT, UPDATE 
AS 

DECLARE @RetCode int 
SET @RetCode =  50001  

IF EXISTS ( 
SELECT * FROM period PR, inserted INS WHERE 
NOT (INS.name = PR.name) AND INS.type_period = PR.type_period ) AND 

 -- условие пересечения диапазонов дат 
 
( 
(INS.date_from <= PR.date_from AND INS.date_to > PR.date_from) OR 
(INS.date_from >= PR.date_from AND INS.date_from < PR.date_to) OR 
(INS.date_to > PR.date_from AND INS.date_to <= PR.date_to) 
) AND NOT INS.PK=PR.PK

BEGIN 
	ROLLBACK TRANSACTION 
	RAISERROR @RetCode 'Диапазоны дат не могут пересекаться!' 
END 
RETURN
...
Рейтинг: 0 / 0
02.08.2002, 14:22:19
    #32040613
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер
могу только добавить что если пользуеш скул2000
просто использовать замещающий тригер с темже текстом....
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / триггер / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]