Pregunta

Tengo un gatillo en la inserción, pero si el gatillo falla, el inserto también falla.

¿Hay alguna manera de dejar que el inserto continúe incluso si el gatillo falla?

Editar: uso un disparador para enviar un correo electrónico cuando se ingresa un nuevo registro. Quiero que el registro se guarde independientemente de si el correo electrónico se envió o no.

¿Cómo haría eso de un SP?

¿Fue útil?

Solución

No

  • Un desencadenante es parte de la transacción
  • Un error abortará la instrucción Insertar (si no en una transacción explícita)
  • Un error en un desencadenante condenará una transacción (es decir, debe ser retrocedida)
  • Un error en un desencadenante donde están los bloques de prueba/captura no usado (alrededor del inserto también) abortará el lote

No use un gatillo. Use un procedimiento almacenado en su lugar para desacoplar la lógica del inserto.

Personalmente, un desencadenante falla significa que un DRI complejo ha fallado o no puedo escribir en una tabla de historial. Eso es malo...

Editar:

  • Use Service Broker para enviar una notificación desde el disparador.
  • Otro pedazo de código lo recogerá y enviará asíncrono

No me he implementado a mí mismo, así que tendré que referirte Google

Otros consejos

Si no se siente cómodo con el corredor de servicio, aún puede usar el disparador, pero en lugar de enviar el correo electrónico, inserta el contenido del correo electrónico en algún tipo de tabla de cola de correo electrónico. Luego tendrá un proceso de Asynchronouse verificar periódicamente esa tabla y procesar los correos electrónicos por separado, eliminándolos de la cola cuando se envía.

Desacoplar la generación del correo con el envío del correo evitará que las inserciones fallarán, y le permitirá solucionar problemas de correo mientras se puede enviar nuevos correos.

El disparador falla en sus instrucciones normales, valores nulos, etc.

:: Use un activador en lugar de insertar comenzar con

Seleccione en #Inserted de insertado

declarar @Query nvarchar (max), @iretval int

:: Puede pasar por alto el fallido construyendo cada instrucción en una consulta

set @query = n'update .... etc '

:: También es una buena idea verificar la consulta antes del sp_executesql, porque :: Si la consulta es nula, entonces el iretval será 0 de todos modos, es decir,

Si @Query es nulo, comience establecer @iretval = 999 GOTO Último final

::después

exec @iretval = sp_executesql @Query [[parmameters] outvalue] si @iretval> 0 goto último

:: Su inserto debe llevar una bandera o algo para mostrar si el disparador funcionó permitiendo un procesamiento posterior que el disparador no hizo suponiendo que esto sea necesario

Ultimo

Si @iretval = 0 actualizar #inserted set flag = ok

Insertar en la tabla Seleccionar * de #Inserted

::Nota. Debe verificar cada declaración, y si tiene que recuperar los valores de otras tablas, verifique que los valores son válidos y no ISNULL.

Si de algún lado es un ejemplo. Envíeme un correo electrónico jhodgson@tsti.co.za

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top