Вопрос
Я хочу создать триггер для проверки того, что удаляется, на соответствие бизнес-правилам, а затем при необходимости отменить удаление.Есть идеи?
В решении использовался триггер Вместо удаления.Тран откат остановил удаление.Я боялся, что при удалении у меня возникнет каскадная проблема, но этого не произошло.Возможно, триггер не может сработать сам по себе.
Решение
Используйте INSTEAD OF DELETE
(см. MSDN ) триггер и решить внутри триггера, что вы действительно хотите сделать.
Другие советы
В решении использовался триггер вместо удаления. Откат тран остановил удаление. Я боялся, что у меня возникнет каскадная проблема при удалении, но, похоже, этого не произошло. Возможно, триггер не может сработать сам. В любом случае, спасибо всем за помощь.
ALTER TRIGGER [dbo].[tr_ValidateDeleteForAssignedCalls]
on [dbo].[CAL]
INSTEAD OF DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @RecType VARCHAR(1)
DECLARE @UserID VARCHAR(8)
DECLARE @CreateBy VARCHAR(8)
DECLARE @RecID VARCHAR(20)
SELECT @RecType =(SELECT RecType FROM DELETED)
SELECT @UserID =(SELECT UserID FROM DELETED)
SELECT @CreateBy =(SELECT CreateBy FROM DELETED)
SELECT @RecID =(SELECT RecID FROM DELETED)
-- Check to see if the type is a Call and the item was created by a different user
IF @RECTYPE = 'C' and not (@USERID=@CREATEBY)
BEGIN
RAISERROR ('Cannot delete call.', 16, 1)
ROLLBACK TRAN
RETURN
END
-- Go ahead and do the update or some other business rules here
ELSE
Delete from CAL where RecID = @RecID
END
Триггер может откатить текущую транзакцию, что приведет к отмене удаления. Как показано на плакате выше, вы также можете использовать вместо триггера.
Согласно документации MSDN о INSTEAD OF DELETE
триггеры:
Удаленная таблица, отправленная на триггер Delete, содержит изображение рядов, когда они существовали до выпуска оператора Delete.
Если я правильно понимаю, на самом деле выполняется DELETE.Что мне не хватает?
В любом случае, я не понимаю, почему вы хотите удалить записи, и если бизнес-правила не соблюдены, восстановите удаление этих записей.Я готов поклясться, что тестировать будет проще, если вы примете бизнес-правила перед удалением записей.
И я бы сказал, используйте транзакцию, о которой я раньше не слышал INSTEAD OF
триггеры.