|
|
|
проблемма с рекурсивным вызовом тригера
|
|||
|---|---|---|---|
|
#18+
создал тригер для установки флага логического удаления. В таблице храниться структура папок (дерево). Ясно, что при удалении "более верхней папки" нужно удалить и все "нижние". Так вот пытаюсь "удалить" (а на самом деле обновить) одну из строк и вижу ошибку Server: Msg 217, Level 16, State 1, Procedure tAU_RUBRIC, Line 16 Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32). Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2002, 14:28:42 |
|
||
|
проблемма с рекурсивным вызовом тригера
|
|||
|---|---|---|---|
|
#18+
Есть такая глобальная переменная, @@NESTLEVEL которая показывает текущий уровень вложенности при рекурсивном вызове процедуры. В вашем случае триггер должен выглядеть примерно так Код: plaintext 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. Если update вызывается из хранимой процедуры, то следует использовать условие if @@NESTLEVEL < 2 и т.д. т.е. решение получается не совсем универсальное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2002, 15:06:44 |
|
||
|
проблемма с рекурсивным вызовом тригера
|
|||
|---|---|---|---|
|
#18+
Есть такая глобальная переменная, @@NESTLEVEL которая показывает текущий уровень вложенности при рекурсивном вызове процедуры. В вашем случае триггер должен выглядеть примерно так Код: plaintext 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. Если update вызывается из хранимой процедуры, то следует использовать условие if @@NESTLEVEL < 2 и т.д. т.е. решение получается не совсем универсальное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2002, 15:07:48 |
|
||
|
проблемма с рекурсивным вызовом тригера
|
|||
|---|---|---|---|
|
#18+
Сэры, проблема не в этом. Проблема в том, что флаг Update(SomeField) будет установлен даже в том случае, если фактически не было модифицировано ни одной записи. Он устанавливается просто по факту включения поля в перечень модифицируемых полей командой update, а сколько там записей фактически модифицировано (пусть даже и ни одной), до фени. Это раз. Триггер срабатывает на команду update вне зависимости от того, сколько записей фактически должно быть модифицировано (может быть, тоже ни одной). Это два. Из всего сказанного следует вывод, что прежде чем внутри триггера выдавать команду update, которая может привести к рекурсивному запуску триггеров, необходимо до этой команды поставить корректное условие выхода из рекурсии. Я обычно для этой цели использовал if exists(...), в котором проверял, есть ли хоть одна запись, которую необходимо модифицировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2002, 15:22:23 |
|
||
|
проблемма с рекурсивным вызовом тригера
|
|||
|---|---|---|---|
|
#18+
Спасибо разобрался! не хватало условия выхода из рекурсии )) Однако получается что болле 31 уровня папок через тригер ни как не удалить (((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2002, 15:23:04 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32056785&tid=1819740]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
140ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 270ms |
| total: | 491ms |

| 0 / 0 |
