вторник, 13 декабря 2016 г.

MS SQL Server Рекурсия в триггерах (Transcat SQL)

Окружение:

MS SQL Server 2014, Transact SQL

Ситуация

Триггер должен менять поля в других записях этой же таблицы

Вопросы

Работая над этим вопросом столкнулся с проблемой рекурсивных вызовов.
Если триггер апдейтит другие записи, то он может и не вызываться (у меня не вызывался).

За это поведение на уровне БД отвечает настройка рекурсивного вызова триггеров.
Вот скрипт изменения этой настройки.

ALTER DATABASE databasename
SET RECURSIVE_TRIGGERS ON OFF


Посмотреть текущее состояние - можно в свойствах БД.

Также в коде можно проверять уровень вложенности триггеров

IF ((SELECT TRIGGER_NESTLEVEL()) > )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

Комментариев нет:

Отправить комментарий