Pregunta

Tengo una tabla Object que se rellena a partir de un servicio integrado ( que puedo cambiar si es necesario ) de otra base de datos. En ciertos puntos tenemos que añadir manualmente los mensajes en otro ObjectObjectGroup (ObjectId, ObjectGroupId) mesa que se necesita si Object.ObjectType tiene un cierto valor entero. Dado que el servicio de integración no maneja ese tipo de actualización, estoy pensando en añadir un disparador para la tabla de objetos que a su pseudo-código sería el siguiente:

if Object.ObjectType = 10
    begin
        if Object.ObjectNumber like '<string pattern>'
        begin
            insert into ObjectObjectGroup values...
        end
    end

¿Es esta configuración sabia, o hay una mejor manera en términos de rendimiento?

¿Fue útil?

Solución

Medio Copiar / Pegar mi respuesta de este en stackoverflow

Los desencadenantes puede ser muy atractivo, al empezar a usarlos parecen como una bala mágica para todo tipo de problemas. Sin embargo, hacen cosas "mágica" suceda, si no conoce el interior de la base de datos fuera, puede parecer que realmente suceden cosas extrañas (como inserciones en otras tablas, el cambio de los datos de entrada, etc.). Antes de implementar cosas como un disparador Me considero serio en lugar de exigir el uso de una API en todo el esquema (preferiblemente en la base de datos, pero fuera si no se puede).

Algunas cosas que todavía haría uso de disparadores para

  • Hacer un seguimiento de "date_created" y "date_last_edited" campos
  • Inserción "ID" 's (en Oracle, donde no hay campo id auto)
  • Mantener el historial de cambios

cosas que se no desea utilizar disparadores para

  • reglas de negocio / lógica
  • cualquier cosa que conecta el exterior de la base de datos (por ejemplo, un servicio web llamada)
  • Control de acceso
  • Todo lo que no es transaccional (cualquier cosa que haga en el disparador debe ser capaz de deshacer la transacción)

Otros consejos

Sí, es prudente. Ese es el propósito de un disparador en realidad, para llevar a cabo las acciones necesarias después de una inserción / actualización / operación de eliminación sobre una mesa.

Es necesario tomar en cuenta el hecho de que un disparador en MS SQL no manejará cada fila por separado, pero se encargará de todas las filas de la transacción actual a la vez. Así que si una operación insertará 10 filas a la vez, tendrá que pensar en el código de su gatillo para tratar todas las filas a la vez.

Los desencadenantes son una herramienta poderosa, y al igual que cualquier otra herramienta que necesita para tener cuidado al usarlos.

  1. Cuando se comete un error en un disparador cosas pueden ir mal drásticamente y menos que esté ejecutando huellas no se dará cuenta ...

  2. Lo hacen 'mágicamente' / cambio de inserción / Borrar datos que el usuario de la base de datos (la aplicación actual / cualquier aplicación futura / desarrollador haciendo un fuera de actualización) no se dio cuenta / intención.

El gran problema es que después de haber creado el gatillo, no es obvio para otros desarrolladores / usuarios que es un disparador incluso allí y lo que hace.

Dicho esto, ellos son una gran herramienta para el mantenimiento de la integridad de los datos y para una verdadera auditoría de cambios.

Es necesario preguntarse si la lógica que desea poner en el gatillo se sienta mejor con la aplicación (s) o dentro de la base de datos, sopesando los riesgos en ambos lados (lo que ocurre si una nueva aplicación viene y doesn' t cumplir esta regla?)

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