Domanda

domanda abbastanza generale per quanto riguarda i trigger in SQL Server 2005.

In quali situazioni sono trigger tavolo sparato e quali situazioni non è vero?

Le eventuali esempi di codice per dimostrare sarebbe grande.

Sto scrivendo un database basati su audit e solo voglia di essere a conoscenza di eventuali situazioni che potrebbero non sparare il trigger che ho istituito per aggiornare, cancellare e inserire sulle mie tabelle.

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.

È stato utile?

Soluzione

Quando si desidera loro di fuoco?

CREATE TRIGGER AFTER ACTION

che viene eseguito dopo l'azione (insert update delete) commessi. INSTEAD OF spara il grilletto nel luogo dell'azione.

Una delle più grandi cose da sapere sul trigger è che sparano ogni volta che viene eseguita un'azione, anche se nessuna riga sono interessati . Questo non è un bug, ed è qualcosa che può bruciare abbastanza rapidamente se non si sta attenti.

Inoltre, con i trigger, sarete utilizzando le tabelle inserted e deleted. righe aggiornate sono elencati in entrambi. Questo getta un sacco di gente fuori, perché non sono abituati a pensare a un update come delete poi insert.

La documentazione MSDN ha in realtà una discussione piuttosto approfondita su quando trigger fuoco e che effetto hanno qui .

Altri suggerimenti

Nel 2008 è possibile utilizzare costruito in Change Data Capture

Inoltre ci sono alcune situazioni in cui non si inneschi il fuoco, come ad esempio:

· Una tabella viene eliminata.

· Una tabella viene troncata.

· Impostazioni per trigger nidificati e / o ricorsive impediscono un trigger di sparare.

· I dati sono caricati alla rinfusa, trigger bypassando.

  

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

Qualsiasi tipo di azione dichiarazione spara solo il grilletto una volta, non importa quante righe sono affetti, i trigger devono essere scritti per gestire più inserti di righe / aggiornamenti / eliminazioni.

Se il trigger dipende da una sola riga alla volta di essere nelle pseudotables inseriti o cancellati, fallirà. E peggio non mancherà con un errore, semplicemente non influenzerà tutte le righe che si desidera interessati da qualunque sia il grilletto fa. Non risolvere questo problema attraverso un ciclo o di un cursore in un trigger, cambiare alla logica set-based. Un cursore in un trigger può portare tutta la tua app per una brusca frenata, mentre una transazione di 500.000 processi registra e blocca il tavolo per ore.

inserimenti di massa di passaggio innesca se non si specifica di usarli. Essere consapevoli di questo perché se si lascia loro per passare il grilletto è necessario il codice per assicurarsi che tutto ciò che accade nel trigger anche accade dopo l'inserimento di massa. Oppure è necessario chiamare gli inserti di massa con l'opzione FIRE_TRIGGERS.

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 i singoli eliminazioni di fila. Tuttavia, solo quelli con i permessi su un tavolo di eseguire un TRUNCATE TABLE ha bisogno di essere preoccupati per eludere inavvertitamente un trigger DELETE con un'istruzione TRUNCATE TABLE.

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