Окружение:
MS SQL Server 2014, Transact SQLСитуация
Триггер должен менять поля в других записях этой же таблицыВопросы
Работая над этим вопросом столкнулся с проблемой рекурсивных вызовов.Если триггер апдейтит другие записи, то он может и не вызываться (у меня не вызывался).
За это поведение на уровне БД отвечает настройка рекурсивного вызова триггеров.
Вот скрипт изменения этой настройки.
ALTER DATABASE databasename
SET RECURSIVE_TRIGGERS ON | OFF
Посмотреть текущее состояние - можно в свойствах БД.
Также в коде можно проверять уровень вложенности триггеров
IF ((SELECT TRIGGER_NESTLEVEL()) > 5 )RETURN
Обратите внимание, если Вы реите работать с рекурсивными триггерами, то курсоры вам нужно делать обязательно локальные
DECLARE cursor_name CURSOR LOCAL ...
Материалы по теме
How do I prevent a database trigger from recursing?
http://stackoverflow.com/questions/1529412/how-do-i-prevent-a-database-trigger-from-recursing
SQL SERVER – 2005 Understanding Trigger Recursion and Nesting with examples
http://blog.sqlauthority.com/2007/05/18/sql-server-2005-understanding-trigger-recursion-and-nesting-with-examples/
ALTER DATABASE SET Options (Transact-SQL)
https://msdn.microsoft.com/en-us/library/bb522682.aspx
Database Properties (Options Page)
https://msdn.microsoft.com/en-us/library/ms188124.aspx
Turning Recursive and Nested Triggers On and Off
http://www.devx.com/tips/Tip/30031
TRIGGER_NESTLEVEL (Transact-SQL)
https://msdn.microsoft.com/en-us/library/ms182737%28v=sql.105%29.aspx
DECLARE CURSOR (Transact-SQL)
https://msdn.microsoft.com/en-us/library/ms180169.aspx
Комментариев нет:
Отправить комментарий