Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Управвление триггером в хранимой процедуре [D7, IB7.5]


RomanH ©   (2006-04-21 13:07:00) 

Доброго дня мастера.Каким образом можно в хранимой прцедуре приостановить действие триггера котрый увеличивает значение ключевого поля. А после проведения определенных действий вновь включить его.
Alter trigger bef_ins_table inactive;
......
alter trigger bef_ins_Table active; не работает


Desdechado   (2006-04-22 20:13:00) [1]

> Ну так автор же не наращивает ид для значений, меньших указанного значения.
По всей видимости, они наращиваются в другой БД, ЦБД.

> почему иногда надо приостанавливать работу триггера
Репликация делается обычно отдельно, имхо, когда нет подключенных пользователей. Тогда можно и триггеры отключить, причем штатным способом на все время репликации, а не в процедуре его дергать туда-сюда.


Johnmen   (2006-04-21 23:22:00) [2]


> Desdechado ©   (21.04.06 16:53) [9]
>
> Женя, ты меня поражаешь :)
> Бомба в том, что когда-нибудь генератор достигнет этого
> числа, тогда все пойдет кувырком.


Ну так автор же не наращивает ид для значений, меньших указанного значения. По кр. мере, я так понял с его слов и его кода...:) Чисто формально...
Ну а если он просто разделяет диапазон на два, то, конечно, лучше бы взять значение 2^62.


RomanH   (2006-04-21 18:25:00) [3]


> Desdechado ©

Вы были правы
IF( new.id IS NULL ) THEN
new.id = gen_id
так будет правильней.
А на счет бомбы, не знаю.
Просто позвольте мне объяснить почему иногда надо приостанавливать работу триггера.
Когда я добавляю запись на удаленной БД(УБД) ID начинается с 1001000000
на центральной БД(ЦБД) ID начинается с 0.
Когда происходит репликация на УБД я останавливаю триггер и добавляю ID созданные в ЦБД.


Desdechado   (2006-04-21 16:53:00) [4]

Женя, ты меня поражаешь :)
Бомба в том, что когда-нибудь генератор достигнет этого числа, тогда все пойдет кувырком.


Johnmen   (2006-04-21 16:38:00) [5]


> Desdechado ©   (21.04.06 16:29) [7]
>
> > if (new.menid>1001000000)
> ты здесь заложил большую бомбу


А что за бомба? Какой системы?


Desdechado   (2006-04-21 16:29:00) [6]

> if (new.menid>1001000000)
ты здесь заложил большую бомбу


RomanH   (2006-04-21 13:56:00) [7]


> Desdechado ©

Спасибо за подсказку, решил как сделать.
if (new.menid>1001000000) then new.menid=gen_id(gen_men,1);
Если при вставке  новой записи ID > 1001000000 то увеличиваем ID
иначе никаких действий не производим, просто вставляем запись с уже определенным ID.Спасибо еще раз.


Johnmen   (2006-04-21 13:52:00) [8]

> Каким образом можно в хранимой прцедуре приостановить действие
> триггера

Никаким.


Sergey13   (2006-04-21 13:47:00) [9]

2[3] RomanH ©   (21.04.06 13:38)
>> Desdechado ©
>Дело в том что я хочу его на время отключить.(Чтобы он не генерировал новый ID)

Он тебе про это и написал как сделать.


RomanH   (2006-04-21 13:38:00) [10]


> Desdechado ©

Дело в том что я хочу его на время отключить.(Чтобы он не генерировал новый ID)
Вставить новую запись.(Где ID уже определена).
А затем вновь активизировать триггер.


Сергей М.   (2006-04-21 13:29:00) [11]


> Каким образом можно в хранимой прцедуре приостановить действие
> триггера


Никаким.


Desdechado   (2006-04-21 13:14:00) [12]

Можно, но ... нельзя.
Лучше в триггере вставить проверку
IF( new.id IS NULL ) THEN
 new.id = gen_id


Наверх

Титульная страница Поиск, карта сайта Написать письмо