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

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

Объсните разницу триггеров Before и After [D6, FireBird 1.5]


S@shka ©   (2004-08-25 23:45:00) 

Например, UPDATE
before - понятно что физически еще записть не обнавлена и новые значения где то хранятся
after - видимо обновлена.
Но что мне это дает???
Помогите уловить разницу в применении before и after


Sergey13   (2004-08-27 09:09:00) [1]

2[11] S@shka ©   (26.08.04 23:21)
>А в чем я могу выиграть используя триггер After?
>Походу все может быть сделано в Before???
Ну и делай. Кто мешает то.

>update Table set ID=2, Value = 'vvv' where ID = 2 and Value = 'vvvv'
>ничего ни делает
А он и не должен ничего делать по твоему примеру. Т.к. события апдейта (и следовательно срабатывания тригера) не происходит.


Deniz   (2004-08-27 06:17:00) [2]

Тут нужно не триггером, а ХП делать!
вот хороший пример: http://www.ibase.ru/devinfo/testiu.htm
А в тригере after update можно писАть, например, логи.
Create trigger ... after update position 99 ...
в этой ситуации(если конечно триггер последний) у тебя есть уверенность, что запись обновилась и никаких exception не было.


S@shka   (2004-08-26 23:21:00) [3]

Все равно я не понял ...
А в чем я могу выиграть используя триггер After?
Походу все может быть сделано в Before???
И еще ....
Пусть имеем
ID   Value
1     aaaa
4     bbbb

пишем BeforeUpdate
if (old.value is null)
then begin
      insert into Table (new.id,new.value);
     end
....
запрос
update Table set ID=2, Value = 'vvv' where ID = 2 and Value = 'vvvv'
ничего ни делает
Нужен вообщем то для :)) если записи нет - добавить, если есть - обновить.
Insert видимо в beforeUpdate не делается :)
Да???


Zacho   (2004-08-26 19:34:00) [4]


>jack128 ©   (26.08.04 13:55) [9][Ответить]
>
> не правильные сомнения.

Правильные. :) Просто сам пост [1]сформулирован весьма расплывчато и подразумевает разные толкования.
Например, в before insert триггерах может и не возникнуть исключения, а при проверке FK (а она присходит после выполнения триггеров) - возникнет. И запись вставлена не будет. Или exception в after insert - запись тоже вставлена не будет, в чем легко убедиться.


jack128   (2004-08-26 13:55:00) [5]


> Мои сомнения вызвали последние слова той фразы "иначе
> - будет". 8-)


> Правильные сомнения :)
не правильные сомнения. Запись будет добавлена, только вот потом это добавление можно отменить ;-) Если бы запись не была добавлена, то повторный селект в той же транзакции её не увидел бы.


Zacho   (2004-08-26 10:43:00) [6]

Sergey13 ©   (26.08.04 10:08) [7]
Правильные сомнения :)


-SeM-   (2004-08-26 10:08:00) [7]

В Before, например, можешь подготавливать данные для других таблиц.
В After - запись в лог, post_event.


Sergey13   (2004-08-26 10:08:00) [8]

2[5] YurikGL ©   (26.08.04 09:59)
Мои сомнения вызвали последние слова той фразы "иначе - будет". 8-)


YurikGL   (2004-08-26 09:59:00) [9]


> Sergey13 ©   (26.08.04 09:50) [3]

То что если в Before поднять исключение и запись не будет добавлена/удалена/изменена - это точно


Zacho   (2004-08-26 09:58:00) [10]

Неважно, произошло исключение в After или в Before, все равно при этом изменения отменятся.


Sergey13   (2004-08-26 09:50:00) [11]

2[1] jack128 ©   (26.08.04 00:15)
>в если ты подымешь исключение в Before то запись не будет добавлена на таблицу, иначе - будет..
Сомневаюсь я однако.


Anatoly Podgoretsky   (2004-08-26 00:16:00) [12]

Один до выполнения операции, а другой после.


jack128   (2004-08-26 00:15:00) [13]

в Before ты можешь изменить вставляемы значения, а в After - нет..
в если ты подымешь исключение в Before то запись не будет добавлена на таблицу, иначе - будет..


Наверх

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