2009-08-09 13 views
8
domanda

abbastanza generale per quanto riguarda i trigger in SQL Server 2005.Quando fare innesca il fuoco, e quando non è vero

In quali situazioni sono tavolo innesca licenziato e quali situazioni non è vero?

Qualsiasi esempio di codice da dimostrare sarebbe ottimo.

Sto scrivendo un database basato su audit e voglio solo essere a conoscenza di situazioni che potrebbero non attivare i trigger che ho impostato per l'aggiornamento, l'eliminazione e l'inserimento sui miei tavoli.

Un esempio di quello che voglio dire,

UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3); 

La seguente dichiarazione spara solo il trigger di aggiornamento una volta.

+0

Ho imparato ora che non si attiva su TRUNCATE - http://stackoverflow.com/questions/2234223/sql-trigger-on-truncate –

risposta

16

Quando vuoi che sparino?

CREATE TRIGGER AFTER ACTION 

Viene eseguito dopo l'esecuzione dell'azione (insert update delete). INSTEAD OF attiva il trigger al posto dell'azione.

Uno dei più grandi trucchi con i trigger è che si attivano ogni volta che viene eseguita un'azione, anche se non sono interessate righe. Questo non è un bug, ed è qualcosa che può bruciarti abbastanza velocemente se non stai attento.

Inoltre, con i trigger, verranno utilizzate le tabelle inserted e deleted. Le righe aggiornate sono elencate in entrambe. Questo butta via un sacco di gente, perché non sono abituati a pensare a un update come a delete quindi a insert.

La documentazione MSDN presenta in realtà una discussione piuttosto approfondita su quando i trigger si attivano e con quale effetto hanno here.

+0

Puoi fare un esempio che mostra come un trigger può creare problemi quando no le righe sono interessate? Grazie. –

+2

Dai uno sguardo a questo: http://www.sqlfiddle.com/#!6/be3d3/3. Ho visto i trigger programmati per sparare e-mail alla gente. Se si dispone di un processo che inserisce o aggiorna in modo idilliaco i record che raramente influisce su una riga, ma lo sottopone a polling, questo può bruciarti abbastanza rapidamente. Controlla sempre se le righe sono state interessate dai trigger, come regola generale! – Eric

+0

So che questo è vecchio, ma ho appena votato per spiegare l'aggiornamento usando sia inserito che cancellato. Questo mi ha salvato la pancetta dopo aver combattuto per un paio d'ore con il mio grilletto. – gmaness

2

ho pensato di evidenziare dal link Eric ha registrato una situazione in cui un trigger non avrebbe fuoco:

Anche se un'istruzione TRUNCATE TABLE è in effetti un DELETE, non può attivare un trigger perché l'operazione non registra singole eliminazioni di righe. Tuttavia, solo coloro che dispongono di autorizzazioni su una tabella per eseguire una TRUNCATE TABLE devono preoccuparsi di eludere inavvertitamente un trigger DELETE con un'istruzione TRUNCATE TABLE.

5

Nel 2008 è possibile utilizzare costruito in Change Data Capture

Inoltre ci sono un bel paio di situazioni in cui i trigger non vengono attivati, come ad esempio:

· Un tavolo è caduto.

· Una tabella viene troncata.

· Le impostazioni per i trigger nidificati e/o ricorsivi impediscono l'attivazione di un trigger.

· I dati vengono caricati alla rinfusa, ignorando i trigger.

3

L'istruzione seguente attiva il trigger di aggiornamento solo una volta.

Qualsiasi istruzione del tipo di azione attiva il trigger una volta non importa quante righe sono interessate, i trigger devono essere scritti per gestire più inserimenti/aggiornamenti/eliminazioni di riga.

Se il trigger dipende solo da una riga alla volta negli pseudotables inseriti o eliminati, avrà esito negativo. E peggio non fallirà con un errore, semplicemente non influenzerà tutte le righe che vuoi influenzate da quello che fa il trigger. Non aggiustarlo tramite un loop o un cursore in un trigger, passare alla logica basata su set. Un cursore in un trigger può portare l'intera app a un brusco arresto mentre una transazione di 500.000 record elabora la tabella per ore.

Inserimenti bulk by pass a meno che non si specifichi di utilizzarli. Siate consapevoli di questo perché se li lasciate passare il trigger avrete bisogno del codice per assicurarvi che qualsiasi cosa accada nel trigger avvenga anche dopo l'inserimento di massa. Oppure devi chiamare gli inserimenti collettivi con l'opzione FIRE_TRIGGERS.

Problemi correlati