none
Nasted Triggers (Вложенные триггеры) RRS feed

  • Вопрос

  • Всем привет! Я изучаю SQL и у меня возник вопрос по вложенным триггерам. Конечно, я понимаю, что их нужно избегать и по умолчанию они вообще отключены на MSSQL. Дело в том что степень вложенности триггеров максимальна и равна 32. У меня возникло любопытство что будет, если я просто сделаю рекурсивный триггер и получу ошибку. Ошибку я получил, всё отлично. Затем я подумал, а что если я самостоятельно буду управлять вложенностью(продолжать мне рекурсию дальше или нет). Зная, что каждая DML инструкция начинает неявную транзакцию, я написал условие в начале триггера, ссылаясь на глобальную переменную @@TRANCOUNT

    Вот пример кода, который я выполнил

    CREATE TABLE [Examples].[TTR](
    	[Id] [int] NULL,
    	[Name] [varchar](10) NOT NULL
    )
    

    Затем, вещаю простой триггер AFTER INSERT, на  эту таблицу

    CREATE TRIGGER [Examples].[MyTrigger] 
       ON [Examples].[TTR]  -- tableName 
       AFTER INSERT
    AS  
    	BEGIN
    		IF @@TRANCOUNT < 2
    			INSERT Examples.TTR(id, name) VALUES(1, 'Test'); 
    	end

    И просто выполняю INSERT в эту же таблицу

    INSERT Examples.TTR
    (
        Id,
        Name
    )
    VALUES
    (
        0, -- Id - int
        '' -- Name - varchar
    )

    Для меня ожидаемое поведение было такое: Начнётся неявная транзакция, затем в таблицу вставится строчка, вызовется мой триггер, т.к. @@TRANCOUNT = 1 в этот момент, он вставит ещё одну строчку, что в свою очередь приведёт к приращению количества вложенных транзакций и условие не выполнится. Но вылетает ошибка, что достигнут максимальный уровень вложенности в 32 и транзакция откатывается.

    Что я делаю не так? 

Ответы

Все ответы