|
|
|
Проверка пересечения диапазонов в триггере
|
|||
|---|---|---|---|
|
#18+
Есть таблица из 4-х столбцов: номер объекта, номер атрибута объекта, дата начала и дата окончания. Диапазоны дат для каждого атрибута любого объекта не должны пересекаться. Как это проверить в триггере? Перепробовал кучу вариантов,в Query Analyzer все работает, как запихиваю в триггер нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2002, 12:31:45 |
|
||
|
Проверка пересечения диапазонов в триггере
|
|||
|---|---|---|---|
|
#18+
Простите, Вы бы код своего триггера привели... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2002, 13:01:53 |
|
||
|
Проверка пересечения диапазонов в триггере
|
|||
|---|---|---|---|
|
#18+
CREATE TRIGGER tIU_DateAttr ON OrgAttr FOR INSERT, UPDATE AS DECLARE @RetCode int SET @RetCode = 64001 DECLARE @RetNum int DECLARE @RetAttr int DECLARE @RetBDate smalldatetime SELECT @RetNum = OA.NumOrg, @RetAttr = OA.NumTypeAttr, @RetBDate = OA.BDate FROM OrgAttr as OA, inserted WHERE OA.NumOrg = inserted.NumOrg AND OA.NumTypeAttr = inserted.NumTypeAttr AND ((inserted.BDate BETWEEN OA.BDate AND ISNULL(OA.EDate,'1/1/2079') OR ISNULL(inserted.EDate,'1/1/2079') BETWEEN OA.BDate AND ISNULL(OA.EDate,'1/1/2079')) OR (inserted.BDate < OA.BDate AND ISNULL(inserted.EDate,'1/1/2079') > OA.BDate)) GROUP BY OA.NumOrg,OA.NumTypeAttr,OA.BDate HAVING COUNT(OA.NumOrg) > 1 IF @@ROWCOUNT > 1 BEGIN ROLLBACK TRANSACTION RAISERROR @RetCode 'Диапазоны дат одного атрибута не могут пересекатся!' END ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2002, 15:11:24 |
|
||
|
Проверка пересечения диапазонов в триггере
|
|||
|---|---|---|---|
|
#18+
не знаю, я бы так написал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2002, 17:33:36 |
|
||
|
Проверка пересечения диапазонов в триггере
|
|||
|---|---|---|---|
|
#18+
Попробовал, не работает! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2002, 17:58:10 |
|
||
|
Проверка пересечения диапазонов в триггере
|
|||
|---|---|---|---|
|
#18+
Попробуйте этот тригер. У меня все вроде работает. Прошу прощение за форматирование - я прямо из Query Analizer`а, а там с табуляторами... CREATE TRIGGER OrgAttr_INSERT ON OrgAttr FOR INSERT, UPDATE AS /* Что такое пересечение диапазонов: 1) INSERTED.BDate <= OrgAtt.BDate AND INSERTED.EDate > OrgAtt.BDate 2) INSERTED.BDate >= OrgAtt.BDate AND INSERTED.BDate < OrgAtt.EDate 3) INSERTED.EDate > OrgAtt.BDate AND INSERTED.EDate <= OrgAtt.EDate */ DECLARE @RetCode int SET @RetCode = 64001 IF EXISTS ( SELECT * FROM inserted INS WHERE EXISTS ( SELECT * FROM OrgAttr OA WHERE NOT (OA.NumOrg = INS.NumOrg AND OA.NumTypeAttr = INS.NumTypeAttr) AND ( (INS.BDate <= OA.BDate AND INS.EDate > OA.BDate) OR (INS.BDate >= OA.BDate AND INS.BDate < OA.EDate) OR (INS.EDate > OA.BDate AND INS.EDate <= OA.EDate) ) ) ) BEGIN ROLLBACK TRANSACTION RAISERROR @RetCode 'Диапазоны дат одного атрибута не могут пересекатся!' END RETURN Проверку проводил так: 1) Создал целевую таблицу OrgAttr 2) Создал вышеприведенный тригер 3) вставил две записи: INSERT INTO OrgAttr VALUES (1,1, '06-06-2002', '06-09-2002') INSERT INTO OrgAttr VALUES (1,2, '06-12-2002', '06-18-2002') 4) Попытался вставить запись, нарушающее условие 1: INSERT INTO OrgAttr VALUES (2,1, '06-05-2002', '06-09-2002') 5) ... нарушающее условие 2 INSERT INTO OrgAttr VALUES (2,1, '06-07-2002', '06-09-2002') 6) ... нарушающее условие 3 INSERT INTO OrgAttr VALUES (2,1, '06-05-2002', '06-20-2002') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 08:38:28 |
|
||
|
Проверка пересечения диапазонов в триггере
|
|||
|---|---|---|---|
|
#18+
IMHO так немного проще . Проверил - работает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 09:57:06 |
|
||
|
Проверка пересечения диапазонов в триггере
|
|||
|---|---|---|---|
|
#18+
Для Gregory: С уточнением к Вашему примеру - "Если один диапазон полностью внутри другого - то это нормальная ситуация" . Тогда все работает. С уважением, Dominic ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 10:33:59 |
|
||
|
Проверка пересечения диапазонов в триггере
|
|||
|---|---|---|---|
|
#18+
Для Gregory и всех: Пошутил, надо уточнить постановку задачи (см. авторский первый постинг): "Диапазоны дат для каждого атрибута любого объекта не должны пересекаться". Для меня это означает, что при проверке диапазонов в качестве первичного ключа используется само понятие диапазона без возможности пересечения границ у всех записей . Обратите внимание на любовно подставленный в моем примере NOT при сравнении ключевых полей в WHERE подзапроса. Для тех, кто забыл: к моменту, когда "trigger fired", вставляемая запись уже находится в целевой таблице, и она противоречит условию сравнения диапазонов. Поэтому она и исключена этим NOT. Да, поправка к моему примеру. Конечно же надо использовать ISNULL для дат, если поля допускают хранение NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 10:50:29 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32034123&tid=1822146]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 321ms |

| 0 / 0 |
