2012-11-14 12 views
6

ho il limite al di sotto:SQL Server - dopo l'inserimento/per l'inserimento - Annulla

CREATE Trigger instructor_expertise on CourseSections 
    After Insert 
    As Begin 
    ...... 

    If (Not Exists(Select AreaName From AreasOfInstructor Where (InstructorNo = @InstructorNo AND AreaName = @AreaName))) 
    Begin 
    RAISERROR('Course not in instructors expertise', 16, 1) 
    rollback transaction 
    End 
    GO 

La mia domanda è, significa 'operazione di rollback' togliere la fila? Cosa fare se è "Per inserimento" invece, la "transazione di rollback" rimuove la riga in quel caso?

Grazie !!!

+0

@MitchWheat: una transazione esisterà sempre - no? O esplicito o implicito. E il rollback terminerebbe quella transazione e annullerebbe tutto ciò che questa transazione stava tentando di fare al tavolo. –

+1

Sì, mi dispiace Marc, è corretto. Intendevo una transazione esplicita. Penso che possa aver intorbidato l'acqua ... eliminerò il commento precedente. –

+0

Dove prendi quei valori '@ InstructorNo' e' @ AreaName' da ?? Fondamentalmente, se chiami 'ROLLBACK TRANSACTION' nel tuo trigger, ti fermerai ** e interromperà ** il tuo' INSERT' e nessuna riga verrà inserita in tutto –

risposta

13

La sua dichiarazione INSERT viene sempre eseguito in una transazione - o hai esplicitamente definito uno, o se non , quindi SQL Server utilizzerà una transazione implicita.

Stai inserendo una (o più) file nel tuo tavolo. Quindi, sempre all'interno della transazione, viene eseguito il trigger AFTER INSERT e vengono verificate determinate condizioni, in genere utilizzando la pseudo-tabella Inserted disponibile all'interno del trigger, che contiene le righe che sono state inserite.

Se si chiama ROLLBACK TRANSACTION nel vostro grilletto, allora sì - la transazione, con tutto quello che sta facendo, è rollback ed è come se questo non è mai successo INSERT - nulla appare nella vostra tabella di database.

anche: FOR INSERT è lo stesso AFTER INSERT in SQL Server - il grilletto viene eseguito dopo la dichiarazione INSERT ha fatto il suo lavoro.

Una cosa da tenere a mente (che un sacco di programmatori ottenere sbagliato): il grilletto viene sparato una volta per partita - NON volta per ogni riga! Quindi se inserisci 20 righe contemporaneamente, il trigger viene attivato una volta e la pseudo-tabella Inserted all'interno del trigger contiene 20 righe. È necessario tenerne conto quando si scrive il trigger: si è non che si occupa sempre solo di una singola riga inserita!

+1

+1. Soprattutto per il bit del lotto! :) –

0

no, non è possibile, perché quando loro non esiste fila poi andrà in blocco inizierà ...

+1

grazie per la risposta! Come dovrei evitare che la riga venga aggiunta allora? – zoe

Problemi correlati