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, ваши строки уже вставлены, и транзакция не будет нарушена.
Извините, не могу быть более точным, но довольно сложно, не зная, в каком контексте вы вызываете оператор вставки / обновления, запускающий триггер