У меня есть хранимая процедура, которая вызывается внутри триггера при вставке / обновлении / удалении.
Проблема в том, что внутри этого SP есть определенный блок кода, который не является критичным.
Поэтому я хочу игнорировать любые ошибки, возникающие из этого блока кода.
Я вставил этот блок кода в блок TRY CATCH. Но, к моему удивлению, я получил следующую ошибку:
Текущая транзакция не может быть зафиксирована и не может поддерживать операции, которые записывают в файл журнала. Откат транзакции.
Затем я попытался использовать SAVE & ROLLBACK TRANSACTION вместе с TRY CATCH, что тоже привело к ошибке:
Текущая транзакция не может быть зафиксирована и не может быть отменена до точки сохранения. Откат всей транзакции.
Версия моего сервера: Microsoft SQL Server 2008 (SP2) - 10.0.4279.0 (X64)
Образец DDL:
IF OBJECT_ID('TestTrigger') IS NOT NULL
DROP TRIGGER TestTrigger
GO
IF OBJECT_ID('TestProcedure') IS NOT NULL
DROP PROCEDURE TestProcedure
GO
IF OBJECT_ID('TestTable') IS NOT NULL
DROP TABLE TestTable
GO
CREATE TABLE TestTable (Data VARCHAR(20))
GO
CREATE PROC TestProcedure
AS
BEGIN
SAVE TRANSACTION Fallback
BEGIN TRY
DECLARE @a INT = 1/0
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION Fallback
END CATCH
END
GO
CREATE TRIGGER TestTrigger
ON TestTable
FOR INSERT, UPDATE, DELETE
AS
BEGIN
EXEC TestProcedure
END
GO
Код для репликации ошибки:
BEGIN TRANSACTION
INSERT INTO TestTable VALUES('data')
IF @@ERROR > 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
GO