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.

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top