Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Row Trigger befor vs after  [new]
Comparoid
Guest
Где-то (по-моему у Коннор МакДонадльд "Oracle PL\SQL для профессионалов") вычитал, что строковый триггер after upd ест меньше ресурсов, чем before, объясняя это тем, что в row-before триггере базе надо сначала прочитать текущие данные прежде чем их менять.

Но на прикатике обычно встречал только строковые before, а вот after вообще не вспомню.
Вопрос в чем фишка?
Когда вообще целесообразнее использовать строковый after, чем before?

Насколько понимаю, если подразумевается, что чаще триггер успешно пропускает данные для изменения, то лучше after, если же чаще не проупскает, то возможно, лучше before или тогда вообще без разницы.

Кто прояснит? :)
3 апр 12, 10:46    [12355391]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
по возможности лучше вообще не использовать тригера. а before или after зависит только от задачи, разница производительности, если и есть, то настолько мала, что ей можно пренебречь.
3 апр 12, 10:57    [12355470]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
Comparoid
Guest
Vint
По возможности лучше вообще не использовать тригера.

Довольно распространенное мнение, но согласен - как правило, использую их
в крайних случаях, если без них никак.
Хотя блин... Ведь если так, то любое приложение по-моему, можно написать без использования триггеров.
Но почему бы например не повесить на триггеры генерацию PK или опять же лучше генерить его самому подбирая сиквенс при вставке новой записи?

Vint
А before или after зависит только от задачи

А точнее?
Когда вы предпочтете заюзать before, а когда after в зависимости от задачи?
3 апр 12, 11:15    [12355568]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Comparoid,
"Ведь если так, то любое приложение по-моему, можно написать без использования триггеров. " - да можно. есть простой подход. использовать API и не использовать прямую вставку в таблицы. тогда и тригеры не нужны.
"почему бы например не повесить на триггеры генерацию PK или опять же лучше генерить его самому подбирая сиквенс при вставке новой записи?" - при наличии API, как я писал выше, не надо писать лишнего кода тригера. все можно вместить в API, да и вообше... я часто и сиквенсами не пользуюсь(sys_guid() как дефолтное значение вполне прекрасно работает).
"Когда вы предпочтете заюзать before, а когда after в зависимости от задачи? " - до 11 версии не было вычисляемых столбцов и их эмулировали через before insert, update тригер. есть еще какая-то разница между new и old значениями, но за давностью лет я ее забыл. очень уж давно ничего сложнее PK на тригере не пишу, и не хочу)
3 апр 12, 11:23    [12355611]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
Comparoid
Guest
Vint, и все равно странно все это...
Сейчас же вроде как и код триггеров уже скомиленный в базе лежит...
Что в них такого плохого-то? :)
Чисто интуитивно не нравятся они мне и если что-то можно сдлеать процедурой, то лучше сделать ей.
3 апр 12, 11:34    [12355700]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
Comparoid
Guest
Кстати кода лучше юзать row-after так и не понял пока :)
3 апр 12, 11:35    [12355706]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
-2-
Member

Откуда:
Сообщений: 15330
- Таблетки лучше принимать до или после еды?
- Лучше не болеть.
3 апр 12, 11:40    [12355733]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
Comparoid
Guest
Видно, я совсем отстал от жизни.
То есть что триггеры реально прошлый век уже? Отмирают? :)
А что в них плохого-то?
3 апр 12, 11:42    [12355744]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
Comparoid
Guest
Хорошо. Допустим в системе надо ввести аудит, кто создал/изменил запись.
Что проще сгенерить скрипт, который создаст на всех таблицах соотвествующие триггеры и поля? :)
3 апр 12, 11:44    [12355751]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
Comparoid,

проще включить аудит... ))
3 апр 12, 11:45    [12355758]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
да и что значит кто создал изменил и когда - default user, default timestamp
3 апр 12, 11:47    [12355774]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
xxxxnnnn
да и что значит кто создал изменил и когда - default user, default systimestamp
3 апр 12, 11:48    [12355781]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
Comparoid
Guest
xxxxnnnn
да и что значит кто создал изменил и когда - default user, default timestamp

Это не понял.
xxxxnnnn
проще включить аудит... ))

Включить может и проще, но рулить им потом... да и не факт, что этот аудит не жрет ресурсы больше, чем такая неприхотливая системка на триггере или ошибаюсь?
3 апр 12, 12:11    [12355953]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
Comparoid,

А что значит вести аудит? Если добавить в нужные таблицы соответствующие поля - то это понятно разовая операция - и потом для таких целей как вы описали - кто создал и когда запись - соответственно в данные поля по умолчанию user и systimestamp. При изменении уже надо конечно в коде что-то править, но я б в коде лучше нашёл все update, чем триггер бы вешал.

А аудит - там много чего настраивается, и для описанных вами действий - минимальный аудит не загрузит сильно систему.
3 апр 12, 12:17    [12356022]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
Comparoid
Guest
xxxxnnnn, ок. мысль понял, спасибо.
3 апр 12, 12:26    [12356132]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
Elic
Member

Откуда:
Сообщений: 29977
BEFORE vs AFTER. Which trigger is slightly more efficient?
3 апр 12, 12:32    [12356189]     Ответить | Цитировать Сообщить модератору
 Re: Row Trigger befor vs after  [new]
stax..
Guest
Comparoid
Где-то (по-моему у Коннор МакДонадльд "Oracle PL\SQL для профессионалов") вычитал, что строковый триггер after upd ест меньше ресурсов, чем before, объясняя это тем, что в row-before триггере базе надо сначала прочитать текущие данные прежде чем их менять.

Но на прикатике обычно встречал только строковые before, а вот after вообще не вспомню.
Вопрос в чем фишка?
Когда вообще целесообразнее использовать строковый after, чем before?

Насколько понимаю, если подразумевается, что чаще триггер успешно пропускает данные для изменения, то лучше after, если же чаще не проупскает, то возможно, лучше before или тогда вообще без разницы.

Кто прояснит? :)

фігня ето
банально

ERROR at line 2:
ORA-04084: cannot change NEW values for this trigger type

другой вопрос, стоит ли переходить на новочесные compaund триггера
я не знаю

after гарантирует что все уже изменено в before, и данные мона пользовать напр для аудита
особенно актуально было в древних версиях, где порядок срабатывания триггеров НЕ ГАРАНТИРОВАЛСЯ

напр
в своем бифоре сделаете запись в табличку аудита значения олд и нев,
а физически в таблицу запишутяся другие данные :нев измененные в вызванном после вашего другом триггере



.....
stax
3 апр 12, 13:09    [12356581]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить