Pregunta

He oído hablar de desencadenantes y tengo algunas preguntas.
¿Qué son los desencadenantes?
¿Cómo los configuro?
¿Hay alguna precaución, aparte de las típicas cosas de SQL, que se deba tomar?

¿Fue útil?

Solución

Los disparadores le permiten realizar una función en la base de datos cuando ocurren ciertos eventos (por ejemplo, una inserción en una tabla).

No puedo comentar sobre MySQL específicamente.

Precaución:Los desencadenantes pueden ser muy atractivos; cuando empiezas a usarlos, parecen una solución mágica para todo tipo de problemas.Pero hacen que sucedan cosas "mágicas", si no conoce la base de datos al revés, puede parecer que suceden cosas realmente extrañas (como inserciones en otras tablas, cambios de datos de entrada, etc.).Antes de implementar cosas como un disparador, consideraría seriamente imponer el uso de una API alrededor del esquema (preferiblemente en la base de datos, pero afuera si no se puede).

Algunas cosas para las que todavía usaría desencadenantes

  • Seguimiento de los campos "date_created" y "date_last_edited"
  • Insertar "ID" (en Oracle, donde no hay ningún campo de identificación automática)
  • Mantener el historial de cambios

Cosas para las que no querrías usar desencadenantes

  • reglas/lógica de negocio
  • cualquier cosa que se conecte fuera de la base de datos (por ejemplo, una llamada de servicio web)
  • Control de acceso
  • Cualquier cosa que no sea transaccional (cualquier cosa que haga en el disparador DEBE poder revertirse con la transacción)

Otros consejos

De dev.mysql.com, un desencadenante es

... un objeto de base de datos con nombre asociado con una tabla y que se activa cuando ocurre un evento particular para la tabla.

La sintaxis para crearlos. También está documentado en ese sitio..

Brevemente,

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt

Y ponen un ejemplo:

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;

Al menos debes cumplir todas las restricciones sobre las funciones almacenadas.No podrá bloquear tablas, alterar vistas ni modificar la tabla que activó el activador.También desencadenantes puede causar problemas de replicación.

Un desencadenador es un objeto de base de datos con nombre que está asociado con una tabla y que se activa cuando ocurre un evento particular para la tabla.

Para crear un disparador:

CREATE TRIGGER triggerName [BEFORE|AFTER] [INSERT|UPDATE|DELETE|REPLACE] ON tableName FOR EACH ROW SET stuffToDoHERE;


Aunque respondí esta parte, la otra pregunta sigue en pie.

Esta pregunta es antigua y otras respuestas son muy buenas, pero como el usuario preguntó sobre las precauciones que se deben tomar, quiero agregar algo:

  • Si utiliza la replicación en un entorno complejo, no haga un uso masivo de los desencadenadores y no llame a procedimientos almacenados desde los desencadenadores.
  • Los disparadores son lentos en MySQL.
  • No puede utilizar algunas declaraciones SQL dentro de los activadores.Y algunas declaraciones están permitidas pero deben evitarse, como LOCK.La regla general es:Si no comprende completamente las implicaciones de lo que está haciendo, no debería hacerlo.
  • Los desencadenantes pueden provocar bucles interminables, así que tenga cuidado.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top