RAISEERROR или добавьте триггер для отката оператора DML

Просто скажите, что у меня есть триггер или RaiseError в триггере, как показано ниже

IF OBJECT_ID('Sales.OrderDetails_AfterTrigger', 'TR') IS NOT NULL
DROP Trigger Sales.OrderDetails_AfterTrigger;
GO
CREATE TRIGGER Sales.OrderDetails_AfterTrigger ON Sales.OrderDetails
AFTER INSERT, UPDATE
AS
BEGIN
IF @@ROWCOUNT = 0 RETURN;
SET NOCOUNT ON;
-- Check all rows
IF EXISTS(...)
BEGIN
RAISERROR  ('This error message is not displayed', 10, 1 ) 
END
END
GO

Если в триггер будет вставлено повышение ошибки, это предотвратит откат оператора dml?

Просто я заметил, что я все еще вставляю строки, когда это происходит.

1 ответ

Решение

Ознакомьтесь с разделом замечаний на странице ошибок поднятия от Microsoft http://msdn.microsoft.com/en-us/library/ms178592.aspx

"Когда RAISERROR выполняется с серьезностью 11 или выше в блоке TRY, он передает управление в связанный блок CATCH"

Вы бросаете 10, так что управление НЕ перейдет в оператор catch. Это поможет с вашим потоком вызывающего кода, если вы пытаетесь остановить его (не так сложно сказать).

Но!! Вы сделали комментарий, что строки все еще вставлены. Я подозреваю, что вы, возможно, должны использовать триггер обновления вставки, а не триггер "после".

Поскольку вы бросаете 10, ваши строки уже вставлены, и транзакция не будет нарушена.

Извините, не могу быть более точным, но довольно сложно, не зная, в каком контексте вы вызываете оператор вставки / обновления, запускающий триггер

Другие вопросы по тегам