Domanda

Ho un trigger su inserto, ma se il grilletto non riesce l'inserimento non riesce troppo.

c'è un modo per lasciare l'inserto procedere anche se il grilletto non riesce?

EDIT: Io uso un trigger per inviare un e-mail quando viene inserito un nuovo record. Voglio il record da salvare a prescindere se l'email è stata inviata o no ..

Come dovrei farlo da una sp?

È stato utile?

Soluzione

No

  • Un trigger è parte della transazione
  • Un errore interromperà l'istruzione INSERT (se non in una transazione esplicita)
  • Un errore in un trigger condannerà una transazione (retro che è, deve essere rotolato)
  • Un errore in un trigger in cui try / blocchi catch sono non utilizzato (in tutto l'INSERT troppo) interromperà il batch

Non utilizzare un trigger. Utilizzare una stored procedure, invece di separare la logica dalla INSERT.

Personalmente, un trigger mezzo alcuni complessi DRI ha fallito o, in mancanza non posso scrivere su un tavolo storia. Questa è una brutta cosa ...

Modifica:

  • Usa Service Broker per inviare una notifica dal grilletto.
  • Un altro pezzo di codice lo pick up e inviare in modo asincrono

Non ho me stesso implementato quindi dovrò fare riferimento a Google

Altri suggerimenti

Se non si ha familiarità con Service Broker, si potrebbe ancora utilizzare il grilletto, ma invece di inviare l'e-mail, inserisce il contenuto della e-mail in una sorta di tabella di EmailQueue. Si potrebbe quindi avere un processo asynchronouse controllare periodicamente quel tavolo ed elaborare i messaggi di posta elettronica a parte, di eliminarli dalla coda quando inviate.

Il disaccoppiamento la generazione di posta con l'invio della posta elettronica impedirà gli inserti di fallire, e vi permetterà di problemi di risolvere la posta pur catturando nuovi messaggi da inviare.

YES

Il grilletto non sulle sue istruzioni normali, valori nulli, ecc

:: Utilizzare un inserto Invece di inizio grilletto con

selezionare in #inserted hanno inserito

declare @query nvarchar (max), @ iretval int

:: è possibile ignorare la falliscono con la costruzione di ogni istruzione in una query

Set @ query = N'update .... etc '

:: è anche una buona idea controllare query prima della sp_executesql, perché :: se l'interrogazione è nullo allora l'iretval sarà 0 comunque cioè

se @query è nullo inizio set @ iretval = 999 goto ultima end

:: poi

exec @ Iretval = sp_executesql @query [[parmameters] outvalue] se @iretval> 0 goto Ultimo

:: vostro inserto dovrebbe portare una bandiera o qualcosa da mostrare se il trigger funzionato permettendo la successiva elaborazione che il grilletto non ha fatto assumendo questo è necessario

Ultimo

se @ iretval = 0 aggiornamento #inserted set bandiera = ok

Inserisci nella tabella select * from #inserted

:: nota. è necessario verificare ogni affermazione, e se si deve recuperare i valori di altre tabelle controllare i valori sono validi e non isnull.

se anywants un esempio. email me jhodgson@tsti.co.za

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top