powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Один триггер или два?
9 сообщений из 9, страница 1 из 1
Один триггер или два?
    #32425566
Bee_Coff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите студенту. Если в триггере выполняются два разных действия, то создавать два или один триггер? Я сделал вот так, вроде работает (FB1.5)

CREATE TRIGGER ORDERS_BI FOR ORDERS
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE MAX_NTD INTEGER;
DECLARE VARIABLE TMP1 DATE;
BEGIN
TMP1='today';
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_ORDERS_ID,1);
select MAX(NTD_ORDER) from ORDERS where DT_ORDER=:TMP1 INTO MAX_NTD;
IF (:MAX_NTD IS NULL) THEN
MAX_NTD=0;
IF (:MAX_NTD IS NOT NULL) THEN
NEW.NTD_ORDER=(:MAX_NTD+1);
END

Поправьте, если криво написал. В триггере заполняется поле первичного ключа, а потом в зависимости от даты расставляются номера по порядку(дата и номера для контроля действий пользователя, пользователь их редактировать не может). Делить триггер на два?
...
Рейтинг: 0 / 0
Один триггер или два?
    #32425569
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
триггера 2 ненадо, а вот генератор еще один заведи.
у тебя поле max_ndt может быть одинаковым для разных записей.
и проверка
IF (:MAX_NTD IS NOT NULL) THEN
лишняя, ты же уже проверил
IF (:MAX_NTD IS NULL) THEN

насчет второго гнератора подумай. я твоей логики не знаю, тебе виднее, может и не нужен он.
...
Рейтинг: 0 / 0
Один триггер или два?
    #32425574
Bee_Coff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To alex_k

Я, чтобы не было возможности занести одинаковые значения сделал так:

ALTER TABLE ORDERS ADD CONSTRAINT UNQNTD_ORDERS UNIQUE (DT_ORDER, NTD_ORDER);

Теперь, правда, думаю (и пока не придумал) как Exception прибавить, если вдруг будут введены два одинаковых значения в NTD_ORDER при том же значении DT_ORDER. На сервере или на клиенте это делать? А генератор разве по порядку будет номера ставить? Мне как раз и нужно (по логике), чтобы на каждую дату было 1,2,3,4... Т.е. первая занесенная запись, вторая, третья... на эту дату.
...
Рейтинг: 0 / 0
Один триггер или два?
    #32425585
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не совсем понял.

почему тогда max_ntd не сделаешь вычисляемым?
и вообще, зачем он нужен, если у него прямая зависимость от даты?
...
Рейтинг: 0 / 0
Один триггер или два?
    #32425590
Bee_Coff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To alex_k

Согласен, что поле NTD_ORDER не очень-то информативно. У меня была мысль вводить в триггере дату и время, потом по ним сортировать - вот и было бы понятно что и когда вводилось. Но сказали, чтобы нумерация была. Такая задача.
Если я правильно понял, то вот так сделать?

ALTER TABLE ORDERS
ADD NTD1_ORDER COMPUTED BY (MAX(NTD_ORDER)+1)

Или не правильно это?
...
Рейтинг: 0 / 0
Один триггер или два?
    #32425624
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за необходимость хранить непрерывную нумерацию записей в бд?
никогда с такой не сталкивался

уникальность номера тебе гарантирует _только_ генератор.
все осталбные способы могут дать дублей.
...
Рейтинг: 0 / 0
Один триггер или два?
    #32425751
Даниил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сделать так:
Для уникальности записей ввести генератор - это даст нумерацию по порядку. Если одна запись будет удалена - получается "дырка" в нумерации.
Например, было 1,2,3,4, после удаления 2, стало 1,3,4.
Чтобы эту "дырку" не показывать пользователю, можно нумеровать записи на клиенте (или в ХП - что будет лучше), предварительно отсортировав по сгенерированному генератором (масло масленое) полю (его явно не показывать).
Получится красиво и правильно.
...
Рейтинг: 0 / 0
Один триггер или два?
    #32425865
Bee_Coff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача учебная такая. Если появляется дырка, то удаленная запись помещается в LOG. Спасибо всем за ответы.

To alex_k
Спасибо за подсказку про лишний IF.
...
Рейтинг: 0 / 0
Один триггер или два?
    #32436965
vovan1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если работаешь под IB никогда не создавай больше 1-го триггера. У меня была ситуация что после недельной работы базы один из триггеров не срабатывал. Пришлось объединять в один.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Один триггер или два?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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