27.07.2009, 14:51 | #1 |
Участник
|
в чем преимущества триггеров
Помогите подумать, в чем могут быть преимущества/недостатки использования триггеров на стороне Sql server вместо Ax insert/update/delete?
из очевидных преимуществ :может, проще обращаться к другим sql server -ам из очевидных недостатков:надо пересоздавать при каждой синхронизации таблицы Спасибо |
|
27.07.2009, 14:58 | #2 |
Axapta
|
А в чем состоит ваша задача? Вы вообще про что? Вместо "Ax insert/update/delete" нельзя использовать ничего другого, потому как в этих методах находится/может находиться часть бизнес-логики приложения.
|
|
27.07.2009, 15:02 | #3 |
Участник
|
Задача - логгировать определенные изменения данных в другую таблицу. Поэтому думаю, где лучше писать. На первый взгляд, для моей задачи преимуществ писать это на стороне sql не вижу, но, может, есть кие-то тонкости, о которых я не задумываюсь.
record.Insert/update так и останутся в аксапте, поэтому бизнес-логика не пострадает. |
|
27.07.2009, 15:06 | #4 |
Axapta
|
Чем не устраивает стандартный журнал базы данных? Если не устраивает, то в любом случае что может быть проще, чем перекрыть insert/update в Аксапте? Тем более, сами же пишите, что "надо пересоздавать при каждой синхронизации таблицы". Есть что-то, что вас смущает, раз вы вопрос задали?
|
|
27.07.2009, 15:22 | #5 |
Administrator
|
Общая идеология программирования в АХ такова - что код нужно писать только в АХ без участия БД. Как бы не хотелось. Представьте себе как Вы будете отлаживать код - из отладчика АХ проваливаться в отладчик SQL? А если Вас сменит товарищ, который не умеет работать с отладчиком на SQL Server? (или вообще БД сменят на оракл ).
Конечно - технически - все можно сделать но подумайте шире - код захочется перенести, возможно Вам в этом не придется участвовать, человек, который переносит код - может не знать: а) также хорошо SQL Server как Вы - чтобы уметь перенести триггеры б) что эти триггеры вообще существуют. Ведь в АХ есть перекрестные ссылки, по которым все видно и которые очевидно не строятся по коду, исполняемому вне АХ
__________________
Возможно сделать все. Вопрос времени |
|
27.07.2009, 15:24 | #6 |
Участник
|
Угу. Кроме того, БД могут быть разные.
|
|
27.07.2009, 15:27 | #7 |
Участник
|
Возможно, человек задумывается над тем, чтобы сделать железобетонный лог, который отлавливает даже doInsert/doUpdate и не отключается командой skipDatabaseLog.
Но если уж кто-то может внести правки в код, чтобы отключить лог командой, то этот кто-то наверняка сможет отключить и триггера. Поэтому лучше выбросить из головы затею проконтролировать разработчика, а использовать нормальный журнал базы данных. |
|
27.07.2009, 15:30 | #8 |
Axapta
|
Возможно. Но если это так, то я хочу это от человека услышать, прежде чем советы давать и домысливать за него. Пока этого не прозвучало.
"Вы забыли об этом спросить, но это дом для семейства слепых жирафов" (с) Джоэль http://russian.joelonsoftware.com/Ar...erviewing.html |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
27.07.2009, 15:43 | #9 |
Участник
|
лог не подходит, тк лог нужен не для отслеживания действий пользователя, а чтобы логгировать некоторые из измененных данных в другую БД. например, если такое-то поле изменилось, то надо зафиксировать это событие и вставить записи в другую бд
|
|
27.07.2009, 15:46 | #10 |
Участник
|
Цитата:
2. а почему именно в другую БД? Чем не устраивает вариант логирования в эту же БД, а затем перенос записей в другую БД средствами самой БД? |
|
27.07.2009, 16:16 | #11 |
Участник
|
Вообще то лог отлавливает doInsert/doUpdate. Специально в свое время проверял (была необходимость). Если сомневаетесь, то в salesLine строки вставляются именно командой doInsert() и лог (журнал БД) по ней работает.
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |
27.07.2009, 19:26 | #12 |
Administrator
|
В лог попадет все, что:
а) было настроено попадать (если к примеру, лог будет отключен по событию update, то при событии update ничего туда попадать не будет) б) не было принудительно отключено в коде через параметр skipDatabaseLog Кстати - еще один минус в сторону триггеров. Представьте себе - возникла ситуация, когда надо будет проджобить (разово изменить (удалить/добавить) записи) табличку в АХ. При этом ну никак нельзя эти изменения переносить во вторую БД. Это в начале кажется что такого не было и быть не может. По факту - такие ситуации возникнут - 100% рано или поздно. В АХ лог можно отключить, а вот с триггерами в БД поковыряться придется. А ситуация может быть простая - рассинхронизация Ваших БД. Например, восстанавливали ее из бекапа. Единственное, когда штатный лог не подойдет - это когда Вы заходите чтобы данные при переливе - дополнительно обрабатывались. Но это уже другая тема.
__________________
Возможно сделать все. Вопрос времени |
|
28.07.2009, 08:36 | #13 |
Сам.AX
|
Почитал и стало грустно.
Вы помогаете друг другу или играете в "кто умнее" ? Уважаемый IKA примите мои соболезнования. |
|
28.07.2009, 09:54 | #14 |
Участник
|
Не грустите понапрасну Форум - это не техподдержка, где задал вопрос - получил ответ, и все - тема закрыта. Очень часто обсуждение уходит в сторону от изначального вопроса, отнюдь не становясь при этом менее интересным другим участникам форума. Опять же, помощь бывает разная: голодному можно дать рыбу, а можно научить ее ловить
|
|
|
За это сообщение автора поблагодарили: Alexx7 (1). |
28.07.2009, 11:51 | #15 |
Участник
|
Могу добавить + к триггеру - например, идет удаление чего-то (строка отгрузки, например) - частенько в алгоритме присутствует несколько транзакций в разных классах, методах... Вдруг обрыв (ну хз - АОС упал, сеть порвалась и др.) останется хвост (частенько у себя чистим - только не надо про кривых программеров и т.д. - Косяпта сама не всегда идеально с транзакциями работает) - триггер такого не допустит - либо все удалится, либо ничего.
То-же само и при модификации строки. |
|
28.07.2009, 11:57 | #16 |
Axapta
|
|
|
28.07.2009, 12:27 | #17 |
Участник
|
А недавно кто-то job выкладывал на этот счет с вложеными транзакциями.
|
|
28.07.2009, 12:34 | #18 |
Axapta
|
Вы про это? Там нет примера того, что Аксапта при откатывании транзакций оставляет какой-то "хвост".
|
|
28.07.2009, 21:37 | #19 |
Administrator
|
Цитата:
Сообщение от egorych
Могу добавить + к триггеру - например, идет удаление чего-то (строка отгрузки, например) - частенько в алгоритме присутствует несколько транзакций в разных классах, методах... Вдруг обрыв (ну хз - АОС упал, сеть порвалась и др.) останется хвост (частенько у себя чистим - только не надо про кривых программеров и т.д. - Косяпта сама не всегда идеально с транзакциями работает) - триггер такого не допустит - либо все удалится, либо ничего.
То-же само и при модификации строки. Но тем не менее - если бы утверждение, что "триггер не пропустит" было бы неверно - то про триггер никто бы не вспоминал. Ни у кого же не возникает (надеюсь!) мысли натравить 2 приложения на одну базу и передавать управление из одной Аксапты в другую
__________________
Возможно сделать все. Вопрос времени |
|
28.07.2009, 23:48 | #20 |
MCITP
|
Цитата:
Сообщение от egorych
Могу добавить + к триггеру - например, идет удаление чего-то (строка отгрузки, например) - частенько в алгоритме присутствует несколько транзакций в разных классах, методах... Вдруг обрыв (ну хз - АОС упал, сеть порвалась и др.) останется хвост (частенько у себя чистим - только не надо про кривых программеров и т.д. - Косяпта сама не всегда идеально с транзакциями работает) - триггер такого не допустит - либо все удалится, либо ничего.
То-же само и при модификации строки. По сути ответ был дан в самом первом посте самим же топикстартером... ++ "близость" к данным, как следствие независимость от приложения и, в какой-то степени, скорость работы -- потенциальная постоянная "рассинхронизация" с приложением
__________________
Zhirenkov Vitaly |
|