powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5 как запретить перекрывающиеся диапазоны
2 сообщений из 2, страница 1 из 1
ASE 12.5 как запретить перекрывающиеся диапазоны
    #34908574
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот еще задачка для гуру в ASE.
Есть таблица хранящая временные периоды.
Код: plaintext
1.
2.
3.
4.
5.
create table t(
    event_type integer,
    event_start datetime,
    event_end   datetime
    primary key(event_type, event_start)
)
Надо запретить появление записей в которых периоды пересекаются.
На WatcomSQL в ASA я бы это сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create trigger forbid_intersection
    before insert,update
    on t
    referencing new as new_row
    for each row
begin
    if exists (select  1  from t where event_type=new_row.event_type and
               ((event_start>new_row.event_start and event_end>new_row.event_end) or
                (event_start<new_row.event_start and event_end<new_row.event_end)))
       then
         raiseerror  30001  'Event periods can not intersect';
     end if;
end;
Спрашивается, как сделать подобный триггер для ASE 12.5?

---
http://www.rusug.ru] Портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
ASE 12.5 как запретить перекрывающиеся диапазоны
    #34909656
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> Надо запретить появление записей в которых периоды пересекаются.
> На WatcomSQL в ASA я бы это сделал так:
>
> create trigger forbid_intersection
> before insert,update
> on t
> referencing new as new_row
> for each row
> begin
> if exists (select 1 from t where event_type=new_row.event_type and
> ((event_start>new_row.event_start and event_end>new_row.event_end) or
> (event_start<new_row.event_start and event_end<new_row.event_end)))
> then
> raiseerror *30001* 'Event periods can not intersect';
> end if;
> end;
>
> Спрашивается, как сделать подобный триггер для ASE 12.5?

Ну в общем-то такой же триггер можно написать, но будет он
AFTER и FOR ALL ROWS. Т.е. тебе придется обрабатывать скопом все вставленные
(измененные) записи и
либо откатывать транзакцию целиком всю.

либо отменять изменения (вставки и модификации) только неправильных
строк с выдачей сообщения (сообщение в ASE не является обязательным признаком
наличия ошибки и отката транзакции). Отменять - вставки путем встречного
удаления записей, изменения - путем встречных изменений. Данные в INSERTED
/DELETED все есть для этого.

Триггер такой можно конечно приблизительно написать, если тряхнуть стариной.
Ну ежели совсем не сможешь стартануть.

Еще совет - наверное лучше писать два триггера отдельно на UPDATE и INSERT.
Логика будет проще, а реюзать один запрос на получение перес. диапазонов
большого смысла нет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASE 12.5 как запретить перекрывающиеся диапазоны
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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