powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / триггер
3 сообщений из 3, страница 1 из 1
триггер
    #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
триггер
    #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
триггер
    #32040613
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
могу только добавить что если пользуеш скул2000
просто использовать замещающий тригер с темже текстом....
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / триггер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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