|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
Всем привет, написал триггер, который логирует ряд действий пользователей на сервере: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
Собственно вопрос, как можно избежать прерывание транзакции, например если база ADMIN перестала быть доступной или у пользователю не выданы права на запись в таблицу [ADMIN].dbo.ddl_log? С try catch не особо знаком, поможет ли эта инструкция в обработке этой ошибки внутри триггера? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 16:04 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
teCa С try catch не особо знаком, поможет ли эта инструкция в обработке этой ошибки внутри триггера? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 16:06 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
Ведущий профессионал, Не понимаю, как можно подобное оформить. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
В данной инструкции при отсутствии прав у пользователя на доступ к БД ADMIN, получаю ошибку из данного блока: Код: sql 1. 2. 3. 4. 5. 6. 7.
В данном случае, какая из транзакций будет считаться некомментируемой? Та, которая к блоке try? Почему тогда прерывается транзакция, по которой срабатывает триггер? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 16:44 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
В триггере всегда ровно одна транзакция. Вернее, не более одной. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 16:51 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич, Хорошо, как мне добиться, что-бы не прерывалась транзакция, которая инициализирует срабатывание триггера? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 16:54 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
Бывают ошибки компиляции и ошибки выполнения. Чтобы отлавливать и те и другие, содержимое блока try должно быть оформлено в виде DSQL В триггере неявно устанавливно xact_abort = on. Поэтому перехват любой (кроме пользовательских по raiserror) ошибки переведет транзакцию в нефиксируемое состояние. Commit или rollback в триггере приводит к ошибке 3609 и прекращению выполнения текущего пакета. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 16:58 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
invm, Получается, что внутри триггера у меня происходит ошибка выполнения, и из вашего текста, можно сделать вывод, что и проигнорировать эту ошибку нельзя и транзакция в любом случае будет переведена в нефиксируемое состояние? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 17:14 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
teCa, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 17:43 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
teCa invm, Получается, что внутри триггера у меня происходит ошибка выполнения, и из вашего текста, можно сделать вывод, что и проигнорировать эту ошибку нельзя и транзакция в любом случае будет переведена в нефиксируемое состояние? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 18:06 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
teCa, для таких целей существуют аудиты. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2021, 20:17 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
invm teCa, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
В предложенном скрипте, все отлично, запись в таблицу dbo.t происходит при ошибке внутри триггера. Делаю по предложенному примеру и все равно получаю ошибку: авторxact_abort = off Серверу-участнику "BOOKCENTRE\ap.sql" не удалось обратиться к базе данных "ADMIN" в текущем контексте безопасности. Тестовая учетка, у которой нет прав на базу ADMIN авторСообщение 3616, уровень 16, состояние 2, строка 4 Произошла ошибка при выполнении триггера. Выполнение пакета аварийно завершено, и произведен откат пользовательской транзакции, если она существует. Сам триггер: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 12:05 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
teCa, Самый простой и самый неправильный способ 1. Код: sql 1.
2. Код: sql 1. 2. 3. 4.
Правильный способ - делать не триггером, а через https://docs.microsoft.com/ru-ru/sql/relational-databases/service-broker/event-notifications?view=sql-server-ver15 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 12:49 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
Первый способ не то, чтобы неправильный, но он требует ограниченного доступа проверенного персонала к системе и система должна быть изолирована от внешней среды. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 13:11 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
invm, Второй вариант мне не подходит, в таком случае в логе я вижу, что все действия выполняются пользователем with execute as 'dbo'. Попробую разобраться с событиями. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 13:49 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
teCa, Хотя original_login() всё верно определяет, так, что второй вариант вполне себе меня устроит. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2021, 14:03 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
teCa, 1. Что это за "пользователи" у вас, что могут делать UPDATE_STATISTICS ??? 2. "EVENT NOTIFICATION Создает объект, отправляющий в службу компонента Service Broker данные о событии сервера или базы данных". Вроде неплохо выглядит, хотя использовать не приходилось. Но есть одно но. Service Broker весьма чувствителен к нагрузке. Если через него льётся большой поток данных, то могут быть проблемы. Хотя если использовать не для данных, а для вот таких сервисных сообщений, то норм. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 13:19 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
Кесарь Service Broker весьма чувствителен к нагрузке. Если через него льётся большой поток данных, то могут быть проблемы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 18:17 |
|
Обработка ошибки внутри триггера
|
|||
---|---|---|---|
#18+
Ennor Tiegael Кесарь Service Broker весьма чувствителен к нагрузке. Если через него льётся большой поток данных, то могут быть проблемы. Ситуация была не у меня, а у компании. Качался весь поток операционных данных, разумеется. Как внешний, так и внутренний. Хранилища ессно обмены никакие не использовали. Чем больше был поток, тем чаще были затыки. Перешли на кафку, от брокера отказались почти полностью (только для существенно меньшего внутреннего потока, и то не всего, а только части). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2021, 18:36 |
|
|
start [/forum/topic.php?fid=46&msg=40065285&tid=1684683]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 288ms |
total: | 441ms |
0 / 0 |