Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не понятное поведение триггеров  [new]
Genniy
Member

Откуда:
Сообщений: 141
Всем привет!

Коллеги, наткнулся на следующую интересную особенность работы тирггеров и не могу разобраться как решить задачу.

Две сущности:
1. Cущность продажи
2. Сущность продукты в продаже

Два триггра:
1. Триггер по продукту в продаже
2. Триггер по продаже.

1. (триггер по продукту в продаже) При изменении продукта рассчитывается итоговая сумма по продукту
2. (триггер по продукту в продаже) По результату расчета суммы обновялется сумма по продаже в самой продаже
3. (Триггер по продаже) При изменении суммы в продаже производится рассчет, который понимает какая сумма должна рассчитаться и какая рассчиталась. Это необходимо, чтобы не потерять копейки. Сильно сюда можно не погражаться. Здесь все правильно
4.(Триггер по продаже) Если суммы из пункта 3 разные, то необходимо найти продукт в продаже с большей суммой и разницу сумм добавить именно ему.

Так вот, на п.4. почему-то продукт с наибольшей суммой содержит в себе сумму ещё до перерасчетов, т.е. сумму из п1.
Ничего не могу понять, почему именно так. Ожидал, что при срабатывании триггера по продаже сумма по продукту будет уже храниться с новой рассчитанной суммой из пункта 1
15 ноя 14, 13:11    [16850876]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31440
Genniy
Так вот, на п.4. почему-то продукт с наибольшей суммой содержит в себе сумму ещё до перерасчетов, т.е. сумму из п1.
Ничего не могу понять, почему именно так.
Так наверное ошибка в тексте какого нибуть из триггеров.

А так да, при срабатывании триггера данные в таблице уже новые, после изменения.
15 ноя 14, 14:48    [16851237]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
alexeyvg
при срабатывании триггера данные в таблице уже новые, после изменения.
Это откуда следует?
15 ноя 14, 16:42    [16851584]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31440
iap
alexeyvg
при срабатывании триггера данные в таблице уже новые, после изменения.
Это откуда следует?
Из того, что у ТС вряд ли триггер INSTEAD OF, а триггеры AFTER вызываются уже после изменений.
15 ноя 14, 18:19    [16851908]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8729
alexeyvg
iap
пропущено...
Это откуда следует?
Из того, что у ТС вряд ли триггер INSTEAD OF, а триггеры AFTER вызываются уже после изменений.


Что-то уже было про порядок срабатывания триггеров...
16 ноя 14, 09:48    [16853136]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
alexeyvg
вряд ли
Убийственный аргумент!
16 ноя 14, 12:36    [16853366]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Какого черта бизнес-логика в триггерах?
17 ноя 14, 11:17    [16857109]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
хмхмхм
Guest
Владислав Колосов
Какого черта бизнес-логика в триггерах?


это считается плохим тоном?
17 ноя 14, 11:35    [16857269]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
хмхмхм,

это может быть вредительством даже :) Бизнес-логика работает намного дольше простых проверок, как правило. Сопровождение также не лучшее.
17 ноя 14, 12:35    [16857711]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Владислав Колосов
хмхмхм,

это может быть вредительством даже :) Бизнес-логика работает намного дольше простых проверок, как правило. Сопровождение также не лучшее.
Так что, она должна где-то отработать или нет (из-за продолжительности)?
Если должна, то чем процедура, например, лучше триггера?
17 ноя 14, 12:43    [16857759]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
iap, к примеру, процедуру дергают реже, чем триггер, ALTER выполнить проще "на лету". Или не используется явная транзакция при изменении данных. Процедура выполняет все вычисления и быстро обновляет таблицу вместо того, чтобы выполнять вычисления внутри транзакции.
17 ноя 14, 13:03    [16857879]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Добавлю, что необъяснимое поведение данных также объясняется, как правило, перенесением бизнес-логики в триггер.
17 ноя 14, 13:07    [16857912]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Владислав Колосов
iap, к примеру, процедуру дергают реже, чем триггер, ALTER выполнить проще "на лету". Или не используется явная транзакция при изменении данных. Процедура выполняет все вычисления и быстро обновляет таблицу вместо того, чтобы выполнять вычисления внутри транзакции.
Что за ересь?
Процедуру дёргают реже - значит часть данных не соответствуеть бизнес-логике?
Зачем тогда вообще её контроллировать?
Транзакция, в которой выполняется триггер, только мешает? Нонсенс!
Могу конечно, дать плохой совет, как выполнять триггер вне транзакции, но не буду!
Вот жеж придумали транзакции какие-то...
Про ALTER вообще промолчу. Тоже мне, аргумент.
17 ноя 14, 13:08    [16857923]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Glory
Member

Откуда:
Сообщений: 104760
Владислав Колосов
Процедура выполняет все вычисления и быстро обновляет таблицу вместо того, чтобы выполнять вычисления внутри транзакции.

А что при этом будет с целостностью данных в многопользовательской системе ?
17 ноя 14, 13:09    [16857938]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Владислав Колосов
Добавлю, что необъяснимое поведение данных также объясняется, как правило, перенесением бизнес-логики в триггер.


Данные как данные, какое у них поведение... Другой вопрос, что с ними делают процедуры и триггеры.
17 ноя 14, 13:12    [16857964]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
SergeyPK
Member

Откуда:
Сообщений: 44
iap
Владислав Колосов
iap, к примеру, процедуру дергают реже, чем триггер, ALTER выполнить проще "на лету". Или не используется явная транзакция при изменении данных. Процедура выполняет все вычисления и быстро обновляет таблицу вместо того, чтобы выполнять вычисления внутри транзакции.
Что за ересь?
Процедуру дёргают реже - значит часть данных не соответствуеть бизнес-логике?
Зачем тогда вообще её контроллировать?
Транзакция, в которой выполняется триггер, только мешает? Нонсенс!
Могу конечно, дать плохой совет, как выполнять триггер вне транзакции, но не буду!
Вот жеж придумали транзакции какие-то...
Про ALTER вообще промолчу. Тоже мне, аргумент.

Еще один аргумент в поддержку триггеров. При наличии репликации транзакций иногда есть необходимость выполнить некоторые действия только на подписчике.
17 ноя 14, 13:48    [16858356]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Glory
Владислав Колосов
Процедура выполняет все вычисления и быстро обновляет таблицу вместо того, чтобы выполнять вычисления внутри транзакции.

А что при этом будет с целостностью данных в многопользовательской системе ?


Дык нечего пользователям делать в таблицах, впрочем, это вопросы философии.
17 ноя 14, 14:59    [16859117]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Glory
Member

Откуда:
Сообщений: 104760
Владислав Колосов
Glory
пропущено...

А что при этом будет с целостностью данных в многопользовательской системе ?


Дык нечего пользователям делать в таблицах, впрочем, это вопросы философии.

Что ?
Причем тут таблицы ?
Что будет с данными, когда два пользователя одновременно захотят изменить данные, которые процедура "быстро считает без транзакции" ?
17 ноя 14, 15:00    [16859135]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Glory, всё, что может быть из триггера вынесено в процедуру - должно быть вынесено. И точка. Следование этому тезису позволило вывести из кризиса непрерывных дедлоков одну из систем, а практика, извините, критерий истины.
17 ноя 14, 15:04    [16859177]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Glory
Member

Откуда:
Сообщений: 104760
Владислав Колосов
Glory, всё, что может быть из триггера вынесено в процедуру - должно быть вынесено. И точка.

А транзакции и целостность данных - да кому они нужны.
17 ноя 14, 15:07    [16859199]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Glory
Владислав Колосов
Glory, всё, что может быть из триггера вынесено в процедуру - должно быть вынесено. И точка.

А транзакции и целостность данных - да кому они нужны.
Авось никто не заметит!
17 ноя 14, 15:10    [16859231]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Хорошо, такой пример - бизнес логике требуется доступ к различным полям таблицы. Следует ли все проверки корректности поместить в один триггер? А если обновление поля в единственном случае требует предварительного вычисления медленной CLR функции?
17 ноя 14, 15:20    [16859354]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Glory
Member

Откуда:
Сообщений: 104760
Владислав Колосов
Следует ли все проверки корректности поместить в один триггер?

Вы подменяете смысл.
Вы предложили вообще отказаться от транзакции.
И записали в преимущества процедуры перед триггером именно отсутствии транзакции.
Это невозможно при более-менее сложной логике
17 ноя 14, 15:24    [16859387]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Владислав Колосов
Glory, всё, что может быть из триггера вынесено в процедуру - должно быть вынесено. И точка. Следование этому тезису позволило вывести из кризиса непрерывных дедлоков одну из систем, а практика, извините, критерий истины.


Ну раз одну из...тогда да...
17 ноя 14, 15:48    [16859677]     Ответить | Цитировать Сообщить модератору
 Re: Не понятное поведение триггеров  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Владислав Колосов
Glory, всё, что может быть из триггера вынесено в процедуру - должно быть вынесено. И точка.
Как категорично...
Владислав Колосов
Следование этому тезису позволило вывести из кризиса непрерывных дедлоков одну из систем, а практика, извините, критерий истины.
Да уж. Бороться с дедлоками путем отказа от транзакционности - офигительный критерий истины. Может это и было допустимо для частного случая, но зачем же обобщать на весь мир?

ЗЫ: Триггеры - инструмент. Любым инструментом нужно уметь пользоваться и знать как он работает, а не вешать вместо этого ярлыки типа "триггеры - зло".
17 ноя 14, 15:54    [16859732]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить