Sintaxis

CREATE [OR REPLACE]
    [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]
    TRIGGER [IF NOT EXISTS] trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW
   [{ FOLLOWS | PRECEDES } other_trigger_name ]
   trigger_stmt

Descripción

Esta declaración crea un nuevo disparador. Un disparador 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. El disparador se asocia con la tabla denominada tbl_name, que debe referirse a una mesa permanente. No puede asociar un disparador con un TEMPORARY mesa o una vista.

CREATE TRIGGER requiere el TRIGGER privilegio para la tabla asociada con el disparador. (Antes de MySQL 5.1.6, esta declaración requiere la SUPER privilegio.)

MariaDB comenzando con 10.2.3

Puede tener varios desencadenantes para el mismo trigger_time y trigger_event.

Para obtener identificadores válidos para usar como nombres de desencadenadores, consulte Nombres de identificadores.

O REEMPLAZAR

MariaDB comenzando con 10.1.4

Si se usa y el disparador ya existe, en lugar de devolver un error, el disparador existente se eliminará y se reemplazará por el disparador recién definido.

DEFINER

los DEFINER La cláusula determina el contexto de seguridad que se utilizará al verificar los privilegios de acceso en el momento de la activación del disparador.

SI NO EXISTE

MariaDB comenzando con 10.1.4

Si el IF NOT EXISTS se utiliza una cláusula, el disparador solo se creará si no existe un disparador con el mismo nombre. Si el disparador ya existe, se devolverá una advertencia de forma predeterminada.

trigger_time

trigger_time es el tiempo de acción del disparador. Puede ser BEFORE o AFTER para indicar que el disparador se activa antes o después de cada fila que se va a modificar.

acontecimiento desencadenante

trigger_event indica el tipo de declaración que activa el disparador. los trigger_event puede ser uno de los siguientes:

  • INSERT: El disparador se activa cada vez que se inserta una nueva fila en la tabla; por ejemplo, a través de INSERT, LOAD DATA, y REPLACE declaraciones.
  • UPDATE: El disparador se activa siempre que se modifica una fila; por ejemplo, a través de UPDATE declaraciones.
  • DELETE: El disparador se activa cada vez que se elimina una fila de la tabla; por ejemplo, a través de DELETE y REPLACE declaraciones. Sin embargo, DROP TABLE y TRUNCATE declaraciones en la mesa no activan este disparador, porque no utilizan DELETE. Dejar caer una partición no se activa DELETE desencadenantes, tampoco.

SIGUE / PRECEDE other_trigger_name

MariaDB comenzando con 10.2.3

los FOLLOWS other_trigger_name y PRECEDES other_trigger_name se agregaron opciones en MariaDB 10.2.3 como parte de la compatibilidad con varios desencadenantes por tiempo de acción. Esta es la misma sintaxis utilizada por MySQL 5.7, aunque MySQL 5.7 no tiene soporte para múltiples disparadores.

FOLLOWS agrega el nuevo disparador después de otro disparador mientras PRECEDES agrega el nuevo disparador antes que otro disparador. Si no se utiliza ninguna de las opciones, el nuevo activador se agrega al final de la acción y el tiempo dados.

FOLLOWS y PRECEDES no se almacenan en la definición de disparador. Sin embargo, se garantiza que el orden de activación no cambiará con el tiempo. mysqldump y otros métodos de copia de seguridad no cambiarán el orden de activación. Puede verificar el orden de activación desde el ACTION_ORDER columna en la tabla INFORMATION_SCHEMA.TRIGGERS.

SELECT trigger_name, action_order FROM information_schema.triggers 
  WHERE event_object_table='t1';

Ejemplos de

CREATE DEFINER=`root`@`localhost` TRIGGER increment_animal
  AFTER INSERT ON animals FOR EACH ROW 
   UPDATE animal_count SET animal_count.animals = animal_count.animals+1;

O REEMPLAZAR y SI NO EXISTE

CREATE DEFINER=`root`@`localhost` TRIGGER increment_animal
  AFTER INSERT ON animals FOR EACH ROW
    UPDATE animal_count SET animal_count.animals = animal_count.animals+1;
ERROR 1359 (HY000): Trigger already exists

CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER increment_animal
  AFTER INSERT ON animals  FOR EACH ROW
    UPDATE animal_count SET animal_count.animals = animal_count.animals+1;
Query OK, 0 rows affected (0.12 sec)

CREATE DEFINER=`root`@`localhost` TRIGGER IF NOT EXISTS increment_animal
  AFTER INSERT ON animals FOR EACH ROW
    UPDATE animal_count SET animal_count.animals = animal_count.animals+1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

SHOW WARNINGS;
+-------+------+------------------------+
| Level | Code | Message                |
+-------+------+------------------------+
| Note  | 1359 | Trigger already exists |
+-------+------+------------------------+
1 row in set (0.00 sec)

Ver también

  • Nombres de identificadores

  • Descripción general del disparador

  • GATILLO DE GOTA

  • Tabla de TRIGGERS del esquema de información

  • MOSTRAR DISPARADORES

  • MOSTRAR CREAR DISPARADOR

  • Limitaciones de los disparadores

El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.