Вы можете избежать сообщения об ошибке, поместив UPDATE
в блок TRY / CATCH. Это также позволит вам сообщать об ошибках, которые вы не хотите подавлять. Например, вы можете попробовать это:
BEGIN TRY
UPDATE ProductDemo
SET ListPrice = 100.00
WHERE ProductID = 3
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 3609
BEGIN
DECLARE @errormessage nvarchar(500)
DECLARE @errorstate INT
DECLARE @errorseverity INT
SET @errormessage = 'Error ' + CAST(error_number() AS nvarchar) + ': ' + error_message()
SET @errorstate = error_state()
SET @errorseverity = error_severity()
RAISERROR (@errormessage, @errorseverity, @errorstate)
END
END CATCH
У вас есть еще одна проблема с триггером. Это не предвидит ситуацию, когда несколько строк обновляются одним оператором UPDATE
. Когда вы сохраняете столбцы из таблиц inserted
и deleted
в переменные, вы потеряете информацию из всех строк, кроме последних строк, возвращенных в наборе результатов. Вы можете избежать этой ситуации, заменив свои операторы SELECT
, SET
и INSERT
одним оператором INSERT INTO... SELECT FROM
.
PRINT 'Can''t Change Price'
INSERT INTO #UpdateLIstPrices
SELECT 'Tried to update the price of ' + d.Name
+ ' [ProductID :' + CONVERT(VARCHAR(10), d.ProductId) + '] '
+ ' from '
+ CONVERT(VARCHAR(10), d.ListPrice)
+ ' to ' + CONVERT(VARCHAR(10), i.ListPrice)
FROM inserted i
INNER JOIN deleted d ON i.ProductID = d.ProductID