Я наткнулся на этот вопрос, ища подробности о последовательности событий во время оператора вставки и триггера. В итоге я написал несколько кратких тестов, чтобы подтвердить поведение SQL 2016 (EXPRESS), и подумал, что было бы целесообразно поделиться им, так как это может помочь другим в поиске подобной информации.
На основании моего теста можно выбрать данные из "вставленной" таблицы и использовать их для обновления самих вставленных данных. И, что меня интересует, вставленные данные не видны другим запросам, пока триггер не завершится, и в этот момент окончательный результат будет виден (по крайней мере, лучше, чем я мог бы проверить). Я не проверял это для рекурсивных триггеров и т. Д. (Я ожидаю, что вложенный триггер будет иметь полную видимость вставленных данных в таблицу, но это только предположение).
Например - при условии, что у нас есть таблица «таблица» с целочисленным полем «поле» и полем первичного ключа «pk» и следующий код в нашем триггере вставки:
select @value=field,@pk=pk from inserted
update table set field=@value+1 where pk=@pk
waitfor delay '00:00:15'
Мы вставляем строку со значением 1 для «поля», тогда строка заканчивается значением 2. Более того - если я открою другое окно в SSMS и попробую:
выберите * из таблицы, где pk = @ pk
где @pk - первичный ключ, который я изначально вставил, запрос будет пустым до истечения 15 секунд, а затем отобразит обновленное значение (поле = 2).
Меня интересовало, какие данные видны другим запросам во время выполнения триггера (очевидно, нет новых данных). Я также протестировал с добавленным удалением:
select @value=field,@pk=pk from inserted
update table set field=@value+1 where pk=@pk
delete from table where pk=@pk
waitfor delay '00:00:15'
Снова вставка заняла 15 секунд для выполнения. Запрос, выполняемый в другом сеансе, не показал новых данных - во время или после выполнения триггера вставки + (хотя я ожидал, что любой идентификатор будет увеличиваться, даже если кажется, что никакие данные не будут вставлены).