Esecuzione di trigger DML

I trigger AFTER non vengono mai eseguiti sei si verifica una violazione di un vincolo, pertanto non possono essere utilizzati per elaborazioni che potrebbero impedire violazioni dei vincoli.

I trigger INSTEAD OF vengono eseguiti al posto dell'azione di trigger. Questi trigger vengono eseguiti dopo la creazione delle tabelle inserted e deleted che riflettono le modifiche alla tabella di base ma prima dell'esecuzione di altre azioni. Vengono eseguiti prima di qualsiasi vincolo, pertanto consentono di eseguire una pre-elaborazione in aggiunta alle azioni di vincolo.

Se un trigger INSTEAD OF definito in una tabella esegue un'istruzione sulla tabella che in genere attiverebbe di nuovo il trigger INSTEAD OF, il trigger non viene chiamato in modo ricorsivo. L'istruzione viene invece elaborata come se nella tabella non fosse presente un trigger INSTEAD OF e avvia la catena di operazioni di vincolo e esecuzioni di trigger AFTER. Se, ad esempio, un trigger DML viene definito come trigger INSTEAD OF INSERT per una tabella e il trigger esegue un'istruzione INSERT nella stessa tabella, l'istruzione INSERT eseguita dal trigger INSTEAD OF non chiama di nuovo il trigger. L'istruzione INSERT eseguita dal trigger avvia il processo di esecuzione di azioni di vincolo e attivazione di tutti i trigger AFTER INSERT definiti per la tabella.

Se un trigger INSTEAD OF definito in una vista esegue un'istruzione sulla vista che in genere attiverebbe di nuovo il trigger INSTEAD OF, il trigger non viene chiamato in modo ricorsivo. L'istruzione viene invece risolta come modifiche sulle tabelle di base sottostanti alla vista. In questo caso, la definizione della vista deve soddisfare tutte le restrizioni per una vista aggiornabile. Per una definizione di viste aggiornabili, vedere Modifica di dati tramite una vista. Se, ad esempio, un trigger DML viene definito come trigger INSTEAD OF UPDATE per una vista e il trigger esegue un'istruzione UPDATE che fa riferimento alla stessa vista, l'istruzione UPDATE eseguita dal trigger INSTEAD OF non chiama di nuovo il trigger. L'istruzione UPDATE eseguita dal trigger viene elaborata nella vista come se nella vista non fosse presente un trigger INSTEAD OF. Le colonne modificate dall'istruzione UPDATE devono essere risolte in un'unica tabella di base. Ogni modifica a una tabella di base sottostante avvia la catena di applicazione dei vincoli e di attivazione dei trigger AFTER definiti per la tabella.

I trigger DML utilizzano in genere una quantità di risorse limitata. La maggior parte del tempo necessario per l'esecuzione di un trigger DML è dedicata all'attivazione di riferimenti ad altre tabelle, presenti in memoria o nel database. Le tabelle deleted e inserted sono sempre in memoria. La posizione delle altre tabelle a cui fa riferimento il trigger determina il tempo necessario per eseguire l'operazione.

[!NOTA]

Non è consigliabile utilizzare cursori nei trigger DML in quanto possono avere un impatto negativo sulle prestazioni. Al posto dei cursori, per progettare un trigger DML relativo a più righe utilizzare la logica basata su set di righe.

Esecuzione di trigger DML e viste partizionate

I trigger UPDATE e DELETE nelle tabelle sottostanti una vista partizionata vengono attivati in modo diverso da come vengono attivati in SQL Server 2000. In SQL Server 2000, quando viene eseguita un'istruzione UPDATE o DELETE su una vista partizionata, sia locale che distribuita, vengono attivati i trigger UPDATE o DELETE definiti sulle tabelle di base della vista. Vengono pertanto coinvolti trigger in tabelle non interessate dall'operazione di aggiornamento o eliminazione. In SQL Server 2008 e SQL Server 2005 un trigger UPDATE o DELETE viene attivato solo se la tabella di base su cui è definito il trigger è interessata dall'operazione di aggiornamento o eliminazione. Tale comportamento è lo stesso sia per il trigger AFTER che per il trigger INSTEAD OF.

Si consideri ad esempio una vista partizionata PV costituita da campi delle tabelle T1 e T2. Sia la tabella T1 che la tabella T2 includono trigger UPDATE. In SQL Server 2000 un'istruzione UPDATE eseguita su PV che interessa solo le righe di T1 comporta l'attivazione sia dei trigger UPDATE definiti nella tabella T1 che di quelli definiti nella tabella T2. In SQL Server 2008 e SQL Server 2005 viene attivato solo il trigger UPDATE definito in T1.

Nelle tabelle seguenti vengono riepilogate le differenze di funzionamento.

Operazione di inserimento, aggiornamento o eliminazione su una vista partizionata locale

 

SQL Server 2000

Versione corrente

TRIGGER INSERT

Viene attivato solo nelle tabelle interessate.

Viene attivato solo nelle tabelle interessate.

TRIGGER UPDATE

Viene attivato in tutte le tabelle sottostanti la vista partizionata in cui è definito questo tipo di trigger.

Viene attivato solo nelle tabelle interessate.

TRIGGER DELETE

Viene attivato in tutte le tabelle sottostanti la vista partizionata in cui è definito questo tipo di trigger.

Viene attivato solo nelle tabelle interessate.

Operazione di inserimento, aggiornamento o eliminazione su una vista partizionata distribuita

 

SQL Server 2000

Versione corrente

TRIGGER INSERT

Viene attivato solo nelle tabelle interessate della vista partizionata distribuita. È possibile che vengano attivati i trigger definiti nelle tabelle dell'istanza locale e dell'istanza remota, se le tabelle sono coinvolte.

Viene attivato solo nelle tabelle interessate della vista partizionata distribuita. È possibile che vengano attivati i trigger definiti nelle tabelle dell'istanza locale e dell'istanza remota, se le tabelle sono coinvolte.

TRIGGER UPDATE

Viene attivato in tutte le tabelle sottostanti la vista partizionata in cui è definito questo tipo di trigger.

Viene attivato in tutte le tabelle dell'istanza remota in cui è definito questo tipo di trigger. Viene attivato solo nelle tabelle interessate dell'istanza locale.

TRIGGER DELETE

Viene attivato in tutte le tabelle sottostanti la vista partizionata in cui è definito questo tipo di trigger.

Viene attivato in tutte le tabelle dell'istanza remota in cui è definito questo tipo di trigger. Viene attivato solo nelle tabelle interessate dell'istanza locale.