Come posso cancellare un Delete in SQL
Domanda
Voglio creare un trigger per verificare cosa viene eliminato rispetto alle regole aziendali e quindi annullare la cancellazione, se necessario. Qualche idea?
La soluzione ha utilizzato il trigger Invece di Elimina. Il trans rollback ha interrotto l'eliminazione. Avevo paura che avrei avuto un problema a cascata quando ho fatto l'eliminazione, ma questo non sembrava accadere. Forse un trigger non può attivarsi.
Soluzione
Usa un INSTEAD OF DELETE
(vedi MSDN ) innescare e decidere all'interno dell'attivatore cosa si vuole veramente fare.
Altri suggerimenti
La soluzione ha utilizzato il trigger Invece di Elimina. Il trans rollback ha interrotto l'eliminazione. Avevo paura che avrei avuto un problema a cascata quando ho fatto l'eliminazione, ma ciò non sembra accadere. Forse un trigger non può innescarsi. Ad ogni modo, grazie a tutti per il vostro aiuto.
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
Il trigger può ripristinare la transazione corrente, il che avrà l'effetto di annullare la cancellazione. Come indicato anche nel poster sopra, puoi anche utilizzare un trigger anziché il trigger.
Secondo la documentazione MSDN sui trigger INSTEAD OF DELETE
:
La tabella eliminata inviata a DELETE trigger contiene un'immagine delle righe come esistevano prima dell'eliminazione dichiarazione rilasciata.
Se lo capisco correttamente, il DELETE viene effettivamente eseguito. Cosa mi sto perdendo?
Ad ogni modo, non capisco perché desideri eliminare i record e se le regole aziendali non vengono approvate, ripristina tali record. Vorrei giurare che dovrebbe essere più semplice testare se si superano le regole aziendali prima di eliminare i record.
E avrei detto di usare una transazione, non ho mai sentito parlare dei trigger INSTEAD OF
.