Triggers: The best first statement

Un trigger è ottimizzato se la sua durata è breve.

Inoltre, non dimentichiamoci che un trigger lavora sempre in transazione (implicita o esplicita che sia) e che i lock rimangono al loro posto fino a quando la transazione non viene confermata (commit) o respinta (rollback). Da questo ne consegue che più lunga sarà la durata di un trigger, più alta sarà la probabilità che esso blocchi un altro processo.

Individuare ed eliminare gli errori in una situazione di questo tipo può rivelarsi molto difficile… quindi l’arma migliore è la prevenzione.

Potreste considerarlo banale, ma lo troverete interessante... la prima cosa da fare affinché la durata di un trigger sia breve è stabilire se il trigger debba intervenire oppure no. Se non ci sono righe coinvolte nel (precedente) comando che ha scatenato il trigger significa generalmente che il trigger in questione non dovrà fare nulla.

L’unica cosa, quindi, che si dovrebbe fare all’interno di ogni trigger è verificare la funzione di sistema @@ROWCOUNT (o ROWCOUNT_BIG) per controllare se nel precedente comando SELECT, INSERT, UPDATE o DELETE sono state coinvolte righe. Se ciò non è accaduto (@@ROWCOUNT = 0) non c’è nulla che il trigger possa fare se non restituire il controllo al chiamate con l’istruzione RETURN.

Il seguente frammento di codice T-SQL dovrebbe quindi comparire all’inizio di ogni trigger:

IF (@@ROWCOUNT = 0)
  RETURN

La verifica di @@ROWCOUNT permette anche di stabilire se il numero di righe coinvolte è quello che ci si aspetta. In tutti i casi in cui ci si aspetta venga coinvolta solo una riga, dovrà essere eseguito il test:

IF (@@ROWCOUNT = 1)
  <azione>

Dopo aver superato il test riguardante le righe coinvolte, bisognerebbe verificare se le colonne di nostro interesse sono state aggiornate (ovviamente solo nel caso di trigger su UPDATE) utilizzando l’istruzione:

IF UPDATE(<nome_colonna>)
  <azione>

Nel caso le colonne di nostro interesse non siano state aggiornate, avremmo un’altra occasione per restituire il controllo al chiamante, mantenendo breve la durata del trigger.

 

Published mercoledì 8 settembre 2010 1.16 by sgovoni

Comments

No Comments