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 deINSERT
,LOAD DATA
, yREPLACE
declaraciones. -
UPDATE
: El disparador se activa siempre que se modifica una fila; por ejemplo, a través deUPDATE
declaraciones. -
DELETE
: El disparador se activa cada vez que se elimina una fila de la tabla; por ejemplo, a través deDELETE
yREPLACE
declaraciones. Sin embargo,DROP TABLE
yTRUNCATE
declaraciones en la mesa no activan este disparador, porque no utilizanDELETE
. Dejar caer una partición no se activaDELETE
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.