Come già vi è stato detto, il comando ROLLBACK non può essere modificato/ottimizzato in modo tale che si limitino a ripristinare le istruzioni emesse dal trigger.
Se è necessario un modo per "rollback" azioni eseguite dal trigger solo, è possibile, come soluzione alternativa, considerare la modifica del trigger in modo tale che prima di eseguire le azioni, il trigger si assicuri che tali azioni eseguano non produce situazioni eccezionali che potrebbero causare il rollback dell'intera transazione.
Ad esempio, se il trigger inserisce righe, aggiungere un segno di spunta per assicurarsi che le nuove righe non violino, ad es.vincoli unici (o vincoli di chiave esterna), qualcosa di simile:
IF NOT EXISTS (
SELECT *
FROM TableA
WHERE … /* a condition to test if a row or rows you are about
to insert aren't going to violate any constraint */
)
BEGIN
INSERT INTO TableA …
END;
O, se il trigger elimina le righe, verificare se non tenta di eliminare righe a cui fanno riferimento altre tabelle (in questo caso di solito è necessario sapere in anticipo quali tabelle Might riferimento le righe):
IF NOT EXISTS (
SELECT * FROM TableB WHERE …
)
AND NOT EXISTS (
SELECT * FROM TableC WHERE …
)
AND …
BEGIN
DELETE FROM TableA WHERE …
END
Allo stesso modo, si avrebbe bisogno di effettuare controlli per le dichiarazioni di aggiornamento, se del caso.
fonte
2012-07-16 05:38:53
Doe SQL Server consente effettivamente un 'rollback' in un trigger? –
Suppongo di sì, b'coz ne ho scritto uno, e non ha generato alcun errore durante l'esecuzione dello script e anche il trigger funziona. – Vamsi
Wow. Quello è spaventoso –