Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как временно отключить триггер? / 4 сообщений из 4, страница 1 из 1
30.06.2006, 09:45
    #33823259
Евгений_СТ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить триггер?
Подскажите пожалуйста, как можно реализовать такую идею, или ссылочку киньте если такая тема уже обсуждалась.

БД - АСА 9.0.2

Имеется таблица:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table Oplata (
  flag smallint check(flag in  0 , 1 ),
  dat date;
  opl numeric( 10 , 2 )
);

create trigger Tg_Oplata before insert,update,delete
order  1  on Oplata
referencing new as new_upd old as old_upd for each row
begin
  // Вот тут непонятно ???
  ??? update Oplata set flag =  0  where dat>=new_upd.dat;
end

При любом изменении/добавлении/удалении записи в таблице Oplata, в этой же таблице во всех более поздних по дате записях должен сбрасываться флаг (поле flag). Но тогда триггер будет вызываться не только для основной обрабатываемой записи, но и рекурсивно срабатывать для всех остальных.

Может быть, при срабатывании триггера на основной записи можно как-нибудь временно его отключить, а по окончании обработки - включить снова?
...
Рейтинг: 0 / 0
30.06.2006, 10:48
    #33823461
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить триггер?
Евгений_СТПодскажите пожалуйста, как можно реализовать такую идею, или ссылочку киньте если такая тема уже обсуждалась.
Самый простой способ управления триггерами - это с помощью глобальных сессионных переменных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create trigger Tg_Oplata before insert,update,delete
order  1  on Oplata
referencing new as new_upd old as old_upd
for each row
when (
  varexists('@@Tg_Oplata_Off') =  0 
)
begin
  // Вот тут непонятно ???
  create variable @@Tg_Oplata_Off bit;

  ??? update Oplata set flag =  0  where dat>=new_upd.dat;

  drop variable @@Tg_Oplata_Off;
exception
  when others then
    drop variable @@Tg_Oplata_Off;
    resignal;
end
Соотвествующе триггер сработает, только если не определена глобальная переменная @@Tg_Oplata_Off. В конце кода триггера переменная удаляется как в случае успешного, так в случае неуспешного выполнения кода (где дальше идет поднятие ошибки наверх через RESIGNAL), чтобы переменная не осталась висеть на сессии и триггер снова мог отрабатывать.
...
Рейтинг: 0 / 0
30.06.2006, 12:36
    #33823986
Евгений_СТ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить триггер?
Понятно. Спасибо большое за подсказку!
...
Рейтинг: 0 / 0
30.06.2006, 18:38
    #33825176
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как временно отключить триггер?
Можно еще по другому сделать.
Если уточнить условие задачи: "сбрасывать поле Flag в ноль при изменении значащих полей в записи", то можно переписать заголовок триггера вот так:
Код: plaintext
1.
2.
3.
4.
create trigger Tg_Oplata before insert,update,delete
order  1  on Oplata
referencing new as new_upd old as old_upd for each row
when new_upd.Field1<>old_upd.Field1 or new_upd.Field2<>old_upd.Field2 ...
begin

---
http://www.rusug.ru] Портал рускоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Как временно отключить триггер? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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