|
|
|
Один триггер или два?
|
|||
|---|---|---|---|
|
#18+
Подскажите студенту. Если в триггере выполняются два разных действия, то создавать два или один триггер? Я сделал вот так, вроде работает (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 Поправьте, если криво написал. В триггере заполняется поле первичного ключа, а потом в зависимости от даты расставляются номера по порядку(дата и номера для контроля действий пользователя, пользователь их редактировать не может). Делить триггер на два? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2004, 18:48 |
|
||
|
Один триггер или два?
|
|||
|---|---|---|---|
|
#18+
триггера 2 ненадо, а вот генератор еще один заведи. у тебя поле max_ndt может быть одинаковым для разных записей. и проверка IF (:MAX_NTD IS NOT NULL) THEN лишняя, ты же уже проверил IF (:MAX_NTD IS NULL) THEN насчет второго гнератора подумай. я твоей логики не знаю, тебе виднее, может и не нужен он. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2004, 19:07 |
|
||
|
Один триггер или два?
|
|||
|---|---|---|---|
|
#18+
To alex_k Я, чтобы не было возможности занести одинаковые значения сделал так: ALTER TABLE ORDERS ADD CONSTRAINT UNQNTD_ORDERS UNIQUE (DT_ORDER, NTD_ORDER); Теперь, правда, думаю (и пока не придумал) как Exception прибавить, если вдруг будут введены два одинаковых значения в NTD_ORDER при том же значении DT_ORDER. На сервере или на клиенте это делать? А генератор разве по порядку будет номера ставить? Мне как раз и нужно (по логике), чтобы на каждую дату было 1,2,3,4... Т.е. первая занесенная запись, вторая, третья... на эту дату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2004, 19:33 |
|
||
|
Один триггер или два?
|
|||
|---|---|---|---|
|
#18+
не совсем понял. почему тогда max_ntd не сделаешь вычисляемым? и вообще, зачем он нужен, если у него прямая зависимость от даты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2004, 20:38 |
|
||
|
Один триггер или два?
|
|||
|---|---|---|---|
|
#18+
To alex_k Согласен, что поле NTD_ORDER не очень-то информативно. У меня была мысль вводить в триггере дату и время, потом по ним сортировать - вот и было бы понятно что и когда вводилось. Но сказали, чтобы нумерация была. Такая задача. Если я правильно понял, то вот так сделать? ALTER TABLE ORDERS ADD NTD1_ORDER COMPUTED BY (MAX(NTD_ORDER)+1) Или не правильно это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2004, 20:56 |
|
||
|
Один триггер или два?
|
|||
|---|---|---|---|
|
#18+
Что за необходимость хранить непрерывную нумерацию записей в бд? никогда с такой не сталкивался уникальность номера тебе гарантирует _только_ генератор. все осталбные способы могут дать дублей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2004, 05:41 |
|
||
|
Один триггер или два?
|
|||
|---|---|---|---|
|
#18+
Можно сделать так: Для уникальности записей ввести генератор - это даст нумерацию по порядку. Если одна запись будет удалена - получается "дырка" в нумерации. Например, было 1,2,3,4, после удаления 2, стало 1,3,4. Чтобы эту "дырку" не показывать пользователю, можно нумеровать записи на клиенте (или в ХП - что будет лучше), предварительно отсортировав по сгенерированному генератором (масло масленое) полю (его явно не показывать). Получится красиво и правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2004, 09:51 |
|
||
|
Один триггер или два?
|
|||
|---|---|---|---|
|
#18+
Задача учебная такая. Если появляется дырка, то удаленная запись помещается в LOG. Спасибо всем за ответы. To alex_k Спасибо за подсказку про лишний IF. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2004, 10:56 |
|
||
|
|

start [/forum/topic.php?fid=40&tid=1579060]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
162ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 520ms |

| 0 / 0 |
