Как отменить удаление в SQL
Я хочу создать триггер, чтобы проверить, что удаляется в соответствии с бизнес-правилами, а затем отменить удаление, если это необходимо. Есть идеи?
решение использовало триггер вместо Delete. Откат Тран остановил удаление. Я боялся, что у меня будет каскадная проблема, когда я сделаю удаление, но этого, похоже, не произошло. Может быть, триггер не может сам себя вызвать.
4 ответов
использовать INSTEAD OF DELETE
(см. MSDN) триггер и решить в триггере, что вы действительно хотите сделать.
решение использовало триггер вместо Delete. Откат Тран остановил удаление. Я боялся, что у меня будет каскадная проблема, когда я сделаю удаление, но этого, похоже, не произошло. Может быть, триггер не может сам себя вызвать. В любом случае, спасибо всем за помощь.
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
триггер:
удаленная таблица, отправленная на удаление триггер содержит изображение строк как они существовали до удаления заявление было сделано.
Если я правильно понимаю, удаление фактически выполняется. Что я упускаю?
в любом случае, я не понимаю, почему вы хотите удалить записи, и если бизнес-правила не прошли, то восстановить эти записи. Я можно было бы поклясться, что будет легче проверить, передаете ли вы бизнес-правила перед удалением записей.
и я бы сказал, используйте транзакцию, я раньше не слышал о INSTEAD OF
триггеры.