Eu tenho um gatilho na inserção, mas se o gatilho falhar, a inserção também falhará.
existe uma maneira de permitir que a inserção continue mesmo se o gatilho falhar?
EDIT: Eu uso um gatilho para enviar um e-mail quando um novo registro é inserido. Quero que o registro seja salvo independentemente se o e-mail foi enviado ou não.
Como eu faria isso de um sp?
Não
Não use um gatilho. Em vez disso, use um procedimento armazenado para desacoplar a lógica do INSERT.
Pessoalmente, uma falha de gatilho significa que algum DRI complexo falhou ou não consigo gravar em uma tabela de histórico. Isso é uma coisa ruim...
Editar:
Eu não me implementei, então terei que encaminhá-lo para o Google
Se você não estiver confortável com o Service Broker, ainda poderá usar o gatilho, mas, em vez de enviar o e-mail, ele insere o conteúdo do e-mail em algum tipo de tabela EmailQueue. Você então teria um processo assíncrono verificando periodicamente essa tabela e processando os e-mails separadamente, excluindo-os da fila quando enviados.
Desacoplar a geração do e-mail com o envio do e-mail impedirá que as inserções falhem e permitirá que você solucione problemas de e-mail enquanto ainda captura novos e-mails a serem enviados.
SIM
::Use um início de gatilho em vez de inserir com
selecione em #inserted de Inserted
declare @query nvarchar(max),@iretval int
::Você pode ignorar a falha construindo cada instrução em uma consulta
set @query=N'update.... etc '
:: também é uma boa ideia verificar a consulta antes do sp_executesql, porque :: se a consulta for nula, o iretval será 0 de qualquer maneira, ou seja
se @Query for null start set @iretval=999 ir para o último fim
::então
exec @Iretval=sp_executesql @query [[parmameters] outvalue] if @iretval>0 goto Last
:: sua inserção deve conter um sinalizador ou algo assim para mostrar se o gatilho funcionou, permitindo o processamento subsequente que o gatilho não fez, assumindo que isso é necessário
Último
if @iretval=0 update #inserted set flag=ok
inserir na tabela selecione * de #inserted
::Nota. você deve verificar cada instrução e, se precisar recuperar valores de outras tabelas, verifique se os valores são válidos e não nulos.
se alguém quiser um exemplo. envie-me um e-mail [email protected]