Domanda

Ho una tabella con sopra un trigger di inserimento. Se inserisco in 6000 record in questa tabella in un'istruzione insert da una procedura memorizzata, la procedura memorizzata ritornerà prima del completamento del trigger di inserimento?

Solo per essere sicuro che sto pensando correttamente, il trigger dovrebbe essere chiamato (so che 'chiamato' non è la parola giusta) una volta perché c'era solo 1 istruzione insert, giusto?

La mia domanda principale è: lo sproc finirà anche se il trigger non è stato completato?

È stato utile?

Soluzione

Il trigger di inserimento verrà eseguito una volta per l'intera istruzione di inserimento. Questo è il motivo per cui è importante utilizzare la tabella temporanea inserita per vedere cosa è stato effettivamente inserito e non solo selezionare il singolo record più recente o qualcosa del genere.

Ho appena testato un trigger di inserimento e aggiornamento e, in effetti, sono considerati parte dell'inserimento dal server sql. il processo non terminerà fino al termine del trigger.

Altri suggerimenti

I trigger fanno parte della transazione che li ha chiamati.

Una cosa importante sui trigger di cui devi essere consapevole è che il trigger si attiva una volta per ogni transazione (almeno nel server SQL, dovresti controllare altri dbs, ma anche se elaborerà riga per riga, di solito è un pessima idea), quindi se si inseriscono 6000 registrazioni il grilletto si attiva una volta non 6000 volte. Molte persone non ne sono a conoscenza e scrivono trigger come se elaborassero più inserti di record un record alla volta. Questo non è vero e il tuo trigger deve rendere conto della consegna dell'inserimento di record multipli.

La chiamata del trigger non è asincrona. Ogni chiamata alla procedura di inserimento comporterà l'attivazione del trigger e la procedura non tornerà fino al termine del trigger.

Dai un'occhiata al piano di query per vedere come funziona. Vedrai che le istruzioni nel trigger verranno chiamate per ogni chiamata alla procedura.

Il fatto è che ogni volta che vengono soddisfatti i criteri TRIGGER, il TRIGGER spara. Viene attivato una volta durante l'elaborazione batch o la transazione. Vedi la mia lezione 101 su TRIGGER

Dovresti usare il cursore nell'istruzione insert per elaborare la riga del trigger. Perché i trigger in SQL Server vengono attivati ??una volta per istruzione, non una volta per riga.

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