Trigger INSTEAD OF UPDATE

In una vista o in una tabella è possibile definire trigger INSTEAD OF UPDATE in sostituzione dell'azione standard dell'istruzione UPDATE. Il trigger INSTEAD OF UPDATE definito in una vista in genere modifica i dati di una o più tabelle di base.

Le istruzioni UPDATE che fanno riferimento a viste con trigger INSTEAD OF UPDATE devono fornire valori per tutte le colonne della vista che non ammettono valori Null e alle quali viene fatto riferimento nella clausola SET. Sono incluse le colonne della vista che fanno riferimento alle colonne della tabella di base per cui non è possibile specificare valori di input, ad esempio:

  • Colonne calcolate nella tabella di base.

  • Colonne Identity della tabella di base per le quali IDENTITY INSERT è impostata su OFF.

  • Colonne della tabella di base con il tipo di dati timestamp.

Quando un'istruzione UPDATE che fa riferimento a una tabella tenta di impostare il valore di una colonna calcolata, Identity o timestamp, spesso viene generato un errore perché i valori di queste colonne devono essere determinati da SQL Server. Queste colonne devono essere incluse nell'istruzione UPDATE per rispettare il requisito NOT NULL della colonna. Se tuttavia l'istruzione UPDATE fa riferimento a una vista con un trigger INSTEAD OF UPDATE, è possibile che la logica definita nel trigger ignori queste colonne e l'errore. È pertanto necessario che il trigger INSTEAD OF UPDATE non tenti di aggiornare i valori delle colonne corrispondenti della tabella di base. A tale scopo, è necessario evitare di includere le colonne nella clausola SET dell'istruzione UPDATE. Quando viene elaborato un record della tabella inserted, la colonna calcolata, Identity o timestamp può contenere un valore fittizio per rispettare il requisito della colonna NOT NULL, ma il trigger INSTEAD OF UPDATE ignora questi valori e i valori corretti vengono impostati da SQL Server.

Questa soluzione funziona, perché non è necessario che un trigger INSTEAD OF UPDATE elabori i dati delle colonne inserted che non vengono aggiornate. Nella tabella inserted passata a un trigger INSTEAD OF UPDATE, le colonne specificate nella clausola SET rispettano le stesse regole delle colonne inserted in un trigger INSTEAD OF INSERT. Le colonne della tabella inserted che non sono specificate nella clausola SET contengono i valori esistenti prima dell'esecuzione dell'istruzione UPDATE. Il trigger può verificare se una colonna specifica è stata aggiornata tramite l'utilizzo della clausola IF UPDATE(column). Per ulteriori informazioni, vedere Trigger INSTEAD OF INSERT.

Nei trigger INSTEAD OF UPDATE è consigliabile utilizzare i valori forniti per le colonne calcolate, Identity o timestamp unicamente per le condizioni di ricerca della clausola WHERE.

Per elaborare i valori aggiornati delle colonne calcolate, Identity, timestamp o predefinite, un trigger INSTEAD OF UPDATE in una vista dovrebbe utilizzare la stessa logica applicata ai valori inseriti per questi tipi di colonne.

Nota

Non è possibile definire trigger INSTEAD OF UPDATE in una tabella per cui è stata definita una chiave esterna tramite un'azione UPDATE.

Vedere anche

Concetti