<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>http://wiki.cabal.mx/index.php?action=history&amp;feed=atom&amp;title=Curso_de_MariaDB_Desde_la_Consola%2FTriggers</id>
	<title>Curso de MariaDB Desde la Consola/Triggers - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.cabal.mx/index.php?action=history&amp;feed=atom&amp;title=Curso_de_MariaDB_Desde_la_Consola%2FTriggers"/>
	<link rel="alternate" type="text/html" href="http://wiki.cabal.mx/index.php?title=Curso_de_MariaDB_Desde_la_Consola/Triggers&amp;action=history"/>
	<updated>2026-04-21T04:46:57Z</updated>
	<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
	<generator>MediaWiki 1.32.1</generator>
	<entry>
		<id>http://wiki.cabal.mx/index.php?title=Curso_de_MariaDB_Desde_la_Consola/Triggers&amp;diff=122388&amp;oldid=prev</id>
		<title>Rrc: /* Errores de Trigger */</title>
		<link rel="alternate" type="text/html" href="http://wiki.cabal.mx/index.php?title=Curso_de_MariaDB_Desde_la_Consola/Triggers&amp;diff=122388&amp;oldid=prev"/>
		<updated>2016-11-27T05:40:35Z</updated>

		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Errores de Trigger&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__NOTOC__&lt;br /&gt;
* [[:#Triggers y Events | Triggers y Events]]&lt;br /&gt;
* [[:#Sintaxis | Sintaxis]]&lt;br /&gt;
* [[:#Descripción | Descripción]]&lt;br /&gt;
* [[:#Triggers y Errores | Triggers y Errores]]&lt;br /&gt;
* [[:#Crear un Trigger | Crear un Trigger]]&lt;br /&gt;
* [[:#Borrar un Trigger | Borrar un Trigger]]&lt;br /&gt;
* [[:#Errores de Trigger | Errores de Trigger]]&lt;br /&gt;
&lt;br /&gt;
= Triggers y Events =&lt;br /&gt;
A trigger, as its name suggests, is a set of statements that run, or are triggered, when an event occurs on a table.&lt;br /&gt;
&lt;br /&gt;
== Sintaxis ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER &amp;lt;Trigger name&amp;gt;&lt;br /&gt;
{BEFORE | AFTER} &amp;lt;trigger event&amp;gt; ON &amp;lt;Table name&amp;gt;&lt;br /&gt;
[ REFERENCING &amp;lt;old or new values alias list&amp;gt; ]&lt;br /&gt;
&amp;lt;triggered action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;trigger event&amp;gt; ::=&lt;br /&gt;
   INSERT |&lt;br /&gt;
   DELETE |&lt;br /&gt;
   UPDATE [ OF &amp;lt;trigger Column list&amp;gt; ]&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;trigger Column list&amp;gt; ::= &amp;lt;Column name&amp;gt; [ {,&amp;lt;Column name&amp;gt;} ... ]&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;old or new values alias list&amp;gt; ::=&lt;br /&gt;
   &amp;lt;old or new values alias&amp;gt;...&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;old or new values alias&amp;gt; ::=&lt;br /&gt;
      OLD [ ROW ] [ AS ] old values &amp;lt;Correlation name&amp;gt; |&lt;br /&gt;
      NEW [ ROW ] [ AS ] new values &amp;lt;Correlation name&amp;gt; |&lt;br /&gt;
      OLD TABLE [ AS ] &amp;lt;old values Table alias&amp;gt; |&lt;br /&gt;
      NEW TABLE [ AS ] &amp;lt;new values Table alias&amp;gt;&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;old values Table alias&amp;gt; ::= &amp;lt;identifier&amp;gt;&lt;br /&gt;
&lt;br /&gt;
         &amp;lt;new values Table alias&amp;gt; ::= &amp;lt;identifier&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;triggered action&amp;gt; ::=&lt;br /&gt;
   [ FOR EACH {ROW | STATEMENT} ] [ WHEN (search condition) ]&lt;br /&gt;
      &amp;lt;triggered SQL statement&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;triggered SQL statement&amp;gt; ::=&lt;br /&gt;
      SQL statement |&lt;br /&gt;
      BEGIN ATOMIC {SQL statement;}... END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Descripción ==&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER define un nuevo Trigger.&lt;br /&gt;
&lt;br /&gt;
El &amp;lt;Trigger name&amp;gt; identifica el Trigger y el Schema al que pertenece. &lt;br /&gt;
Típico &amp;lt;Trigger name&amp;gt;s incluye el evento Trigger, por ejemplo: &lt;br /&gt;
  &amp;quot;Empleado_Update&amp;quot; o &amp;quot;After_Delete_From_Empleado&amp;quot;. &lt;br /&gt;
Un &amp;lt;Trigger name&amp;gt; que incluye un calificador de &amp;lt;nombre de schema&amp;gt; explícito&lt;br /&gt;
pertenece al schema nombrado. &lt;br /&gt;
Un &amp;lt;Trigger name&amp;gt; que no incluye un calificador de &amp;lt;nombre de schema&amp;gt; explícito &lt;br /&gt;
pertenece al schema predeterminado de sesión de SQL. &lt;br /&gt;
El &amp;lt;Trigger name&amp;gt; debe ser único (para todos los Triggers) dentro del schema que lo posee.&lt;br /&gt;
&lt;br /&gt;
Si CREATE TRIGGER es parte de una sentencia CREATE SCHEMA, el &amp;lt;Trigger name&amp;gt;, si está &lt;br /&gt;
explícitamente calificado, debe incluir el &amp;lt;nombre de schema&amp;gt; del schema que se está creando; &lt;br /&gt;
Es decir, no es posible crear un Trigger perteneciente a un schema diferente desde CREATE SCHEMA. &lt;br /&gt;
Por ejemplo, esta sentencia de SQL no devolverá un error porque el &amp;lt;Nombre del trigger&amp;gt; incluirá&lt;br /&gt;
por defecto el &amp;lt;Nombre del schema&amp;gt; que califica:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
CREATE SCHEMA bob&lt;br /&gt;
  CREATE TABLE Table_1 (column_1 SMALLINT)&lt;br /&gt;
  CREATE TRIGGER Trigger_1 AFTER DELETE ON Table_1&lt;br /&gt;
      INSERT INTO Log_table VALUES (&amp;#039;deleted from Table_1&amp;#039;);&lt;br /&gt;
-- creates a Trigger called BOB.TRIGGER_1 in Schema BOB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La instrucción SQL siguiente no devolverá un error ya sea porque el &amp;lt;nombre de trigger&amp;gt;&lt;br /&gt;
incluye explícitamente un &amp;lt;nombre de schema&amp;gt; que califica que coincide con el nombre del&lt;br /&gt;
schema que se está creando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
CREATE SCHEMA bob&lt;br /&gt;
  CREATE TABLE bob.Table_1 (column_1 SMALLINT)&lt;br /&gt;
  CREATE TRIGGER bob.Trigger_1 AFTER DELETE ON Table_1&lt;br /&gt;
      INSERT INTO Log_table VALUES (&amp;#039;deleted from Table_1&amp;#039;);&lt;br /&gt;
-- creates a Trigger called BOB.TRIGGER_1 in Schema BOB&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sin embargo, esta sentencia SQL devolverá un error porque el &amp;lt;nombre del trigger&amp;gt;&lt;br /&gt;
incluye explícitamente un &amp;lt;nombre de schema&amp;gt; que es diferente al nombre del schema&lt;br /&gt;
que se está creando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
CREATE SCHEMA bob&lt;br /&gt;
  CREATE TABLE bob.Table_1 (column_1 SMALLINT)&lt;br /&gt;
  CREATE TRIGGER sam.Trigger_1 AFTER DELETE ON bob.Table_1&lt;br /&gt;
      INSERT INTO Log_table VALUES (&amp;#039;deleted from Table_1&amp;#039;);&lt;br /&gt;
-- tries to create a Trigger belonging to Schema SAM inside Schema BOB; illegal syntax&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si CREATE TRIGGER se ejecuta como una instrucción SQL autónoma, el &amp;lt;AuthorizationID&amp;gt; actual&lt;br /&gt;
debe ser el propietario del schema al que pertenece este nuevo trigger o el propietario del&lt;br /&gt;
Schema debe ser un Role que el actual &amp;lt;AuthorizationID&amp;gt; pueda utilizar. Es decir, sólo el&lt;br /&gt;
propietario de un schema puede crear triggers para ese schema.&lt;br /&gt;
&lt;br /&gt;
Las partes principales de la sentencia CREATE TRIGGER son su tabla, su evento&lt;br /&gt;
(la descripción de la instrucción de cambio de datos de SQL que activa el trigger)&lt;br /&gt;
y su acción (las sentencias de SQL que deben ejecutar el trigger).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;H2&amp;gt;Cláusula ON&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cláusula ON de la instrucción CREATE TRIGGER nombra la Tabla de triggers: la tabla Base que,&lt;br /&gt;
cuando se cambia, puede causar que el trigger actúe. La tabla debe pertenecer al mismo schema al&lt;br /&gt;
que pertenece el trigger y el &amp;lt;AuthorizationID&amp;gt; actual debe tener el privilegio TRIGGER en esa tabla.&lt;br /&gt;
(No se necesita un privilegio para &amp;quot;utilizar&amp;quot; un trigger, los activadores se activarán cada vez que &lt;br /&gt;
ejecute la instrucción de cambio de datos SQL apropiada en la tabla, independientemente de si desea o no).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Tiempo de acción del disparador&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El tiempo de acción del trigger define cuándo desea que se ejecute la acción del trigger:&lt;br /&gt;
puede ser BEFORE p AFTER. El tiempo de acción de trigger debe ser ANTES si desea que la&lt;br /&gt;
acción de trigger ocurra antes del evento de trigger.&lt;br /&gt;
Debe ser después de si desea que la acción de trigger se produzca después del evento&lt;br /&gt;
de trigger&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;h2&amp;gt;Evento de disparo&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El evento Trigger define la sentencia de cambio de datos SQL cuya ejecución activará el trigger:&lt;br /&gt;
puede ser INSERT, DELETE o UPDATE. En el caso de UPDATE sólo, puede agregar una subcláusula opcional &lt;br /&gt;
que enumera las columnas de trigger: las columnas en las que UPDATE activará el trigger &lt;br /&gt;
(UPDATE en columnas que no están en la lista no activará el trigger). La lista de columnas nombra &lt;br /&gt;
algunas o todas las columnas de la tabla de trigger (cada una puede aparecer en la lista sólo una vez).&lt;br /&gt;
Si omite esta subcláusula opcional, el efecto es como si incluyera una cláusula OF que nombra cada&lt;br /&gt;
columna de la tabla del trigger. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Cláusula REFERENCING&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cláusula REFERENCING opcional de la instrucción CREATE TRIGGER define una lista de uno a cuatro &lt;br /&gt;
nombres únicos o alias: un nombre para la fila antigua actuada por el trigger y/o un nombre para &lt;br /&gt;
la nueva fila actuada por el trigger y/o un nombre para la tabla antigua actuada por el trigger y/o &lt;br /&gt;
un nombre para la nueva Tabla actuada por el trigger (cada uno se puede especificar una vez). &lt;br /&gt;
El &amp;lt;keyword&amp;gt; AS en cada opción de alias es ruido y puede omitirse. Si no se especifica ROW ni TABLE, &lt;br /&gt;
el valor por defecto es ROW - por ejemplo, estas cuatro instrucciones SQL son equivalentes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TRIGGER Trigger_1&lt;br /&gt;
  AFTER UPDATE ON Table_1 REFERENCING OLD ROW AS old_row_name&lt;br /&gt;
      FOR EACH ROW INSERT INTO Log_table VALUES (&amp;#039;updated Table_1&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER Trigger_1&lt;br /&gt;
  AFTER UPDATE ON Table_1 REFERENCING OLD ROW old_row_name&lt;br /&gt;
      FOR EACH ROW INSERT INTO Log_table VALUES (&amp;#039;updated Table_1&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER Trigger_1&lt;br /&gt;
  AFTER UPDATE ON Table_1 REFERENCING OLD AS old_row_name&lt;br /&gt;
      FOR EACH ROW INSERT INTO Log_table VALUES (&amp;#039;updated Table_1&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER Trigger_1&lt;br /&gt;
  AFTER UPDATE ON Table_1 REFERENCING OLD old_row_name&lt;br /&gt;
      FOR EACH ROW INSERT INTO Log_table VALUES (&amp;#039;updated Table_1&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Su definición de trigger debe incluir una cláusula REFERENCING si la acción truigger contiene &lt;br /&gt;
referencias al &amp;lt;Nombre de la tabla&amp;gt; del trigger o cualquiera de sus &amp;lt;Nombre de columna&amp;gt;. &lt;br /&gt;
Los valores OLD son los valores antes del evento UPDATE / DELETE Trigger (OLD ROW y OLD TABLE &lt;br /&gt;
no están permitidos si el evento Trigger es INSERT) y los valores NEW son los valores después &lt;br /&gt;
del evento UPDATE / INSERT Trigger (NEW ROW y NEW TABLE No está permitido si el evento de &lt;br /&gt;
trigger es DELETE). Si el tiempo de acción de trigger es ANTES, una cláusula de REFERENCIA no &lt;br /&gt;
puede especificar OLD TABLE o NEW TABLE.&lt;br /&gt;
&lt;br /&gt;
Cada evento Trigger tiene su propio &amp;quot;contexto de ejecución&amp;quot;: incluye los valores antiguos de fila&lt;br /&gt;
y/o los nuevos valores de fila de la Tabla de triggers. Si el evento de trigger es INSERT, &lt;br /&gt;
entonces no hay valores de fila antiguos ya que ninguna fila existente de una tabla se ve &lt;br /&gt;
afectada por INSERT. Si el evento de trigger es DELETE, no hay nuevos valores de fila ya que&lt;br /&gt;
la acción de DELETE es quitar filas de una tabla. Si el evento Trigger es UPDATE, hay tres &lt;br /&gt;
versiones de fila:&lt;br /&gt;
 &lt;br /&gt;
    1. La fila real de datos en la Tabla del trigger.&lt;br /&gt;
 &lt;br /&gt;
    2. La copia &amp;quot;vieja fila&amp;quot; de la fila real - a menudo igual que [1], pero si hay dos eventos &lt;br /&gt;
       distintos de ACTUALIZACIÓN entonces puede haber una diferencia entre [1] y [2]. &lt;br /&gt;
       Llamaremos a esto la &amp;quot;vieja fila&amp;quot; de ahora en adelante. El conjunto de todas las filas &lt;br /&gt;
       antiguas es la &amp;quot;tabla antigua&amp;quot;.&lt;br /&gt;
    &lt;br /&gt;
    3. La copia &amp;quot;new row values&amp;quot; de la fila real: contiene lo que el DBMS propone cambiar la &lt;br /&gt;
       fila real una vez que se completa la ejecución de la instrucción UPDATE. Llamaremos a &lt;br /&gt;
       esto la &amp;quot;nueva fila&amp;quot; de ahora en adelante. El conjunto de todas las nuevas filas es &lt;br /&gt;
       la &amp;quot;nueva tabla&amp;quot;. (Nota: Incluso con un BEFORE Trigger, los &amp;quot;nuevos valores de fila&amp;quot; &lt;br /&gt;
       son conocidos por el DBMS.)&lt;br /&gt;
&lt;br /&gt;
El contexto de ejecución de un Trigger es importante (de hecho, es obligatorio) si va a referirse &lt;br /&gt;
a la Tabla de triggers en las declaraciones de acción del trigger. Normalmente sería incorrecto &lt;br /&gt;
referirse a la Columna COLUMN_1 de la Tabla TABLE_1 con su &amp;lt;Referencia de Columna&amp;gt;, TABLE_1.COLUMN_1, &lt;br /&gt;
ya que la &amp;lt;Referencia de Columna&amp;gt; se refiere a esa Columna en la copia de la Tabla Base actual. &lt;br /&gt;
Lo que realmente necesita hacer referencia es la fila antigua o la nueva fila. La cláusula REFERENCING &lt;br /&gt;
de la instrucción CREATE TRIGGER permite especificar qué nombres de contexto se usan para referirse a &lt;br /&gt;
OLD ROW o NEW ROW en la acción trigger.&lt;br /&gt;
&lt;br /&gt;
El contexto de ejecución es &amp;quot;atómico&amp;quot; en el sentido usual de SQL de la palabra: si cualquier instrucción &lt;br /&gt;
de acción falla, entonces todas las instrucciones de acción fallan y también lo hace la declaración que &lt;br /&gt;
causó la activación del trigger: su DBMS devolverá el error SQLSTATE 09000 &amp;quot;triggered action exception&amp;quot;. &lt;br /&gt;
En otras palabras, la fila antigua y la nueva fila se destruyen simplemente y quedan con la misma cosa &lt;br /&gt;
que empezó: la fila real.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Acción de trigger&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La acción trigger define las sentencias SQL que desea que el trigger ejecute cuando se active&lt;br /&gt;
y tiene tres partes: la granularidad de la acción, la acción cuando la condición y &lt;br /&gt;
el cuerpo de la acción.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Acción Granularidad&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cláusula opcional FOR EACH de la sentencia CREATE TRIGGER define la granularidad de la acción: &lt;br /&gt;
puede ser FOR EACH STATEMENT (la predeterminada) o FOR EACH ROW. La granularidad de acción le indica &lt;br /&gt;
a su DBMS cuán grande es el campo de acción. Por ejemplo, suponga que crea un trigger para &lt;br /&gt;
&amp;quot;AFTER UPDATE OF column_1 ON Employees&amp;quot; y, a continuación, haga lo siguiente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
 UPDATE Employees SET column_1 = 5;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suponga que la tabla EMPLOYEES tiene 1000 filas. Si la granularidad de acción es FOR EACH STATEMENT, &lt;br /&gt;
la acción de trigger se producirá una vez (sólo para la sentencia). Si la granularidad de acción &lt;br /&gt;
es FOR EACH ROW, la acción Trigger se producirá 1000 veces (una vez para cada fila de la tabla de trigger). &lt;br /&gt;
Como se indicó anteriormente, el valor predeterminado es FOR EACH STATEMENT, pero la granularidad de &lt;br /&gt;
&amp;quot;row&amp;quot; es más común. De hecho, si su definición de trigger contiene una cláusula REFERENCING que incluye &lt;br /&gt;
OLD ROW o NEW ROW, también debe incluir una cláusula de granularidad de acción de FOR EACH ROW&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Acción WHEN Condición&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La cláusula WHEN opcional de la sentencia CREATE TRIGGER define la acción trigger cuando condición: &lt;br /&gt;
puede ser cualquier condición de búsqueda entre paréntesis. Cuando se activa el trigger, si la &lt;br /&gt;
condición de búsqueda es TRUE, la acción de trigger ocurrirá, si la condición de búsqueda es FALSE, &lt;br /&gt;
la acción de trigger no se producirá y si la condición de búsqueda es UNKNOWN, aparentemente no se &lt;br /&gt;
producirá la acción de trigger. El documento estándar no está claro sobre este punto. &lt;br /&gt;
Si omite la cláusula WHEN de una definición de trigger, la acción trigger se producirá tan pronto &lt;br /&gt;
como se active el trigger.&lt;br /&gt;
&lt;br /&gt;
Normalmente, agregaría una cláusula WHEN a la definición de trigger si la definición de evento de trigger&lt;br /&gt;
es demasiado general para sus propósitos. Por ejemplo, el evento de trigger podría ser &amp;quot;UPDATE Empleados&amp;quot;, &lt;br /&gt;
pero la acción de trigger debería ocurrir solamente &amp;quot;CUANDO el salario &amp;gt; 1000.00&amp;quot;. &lt;br /&gt;
Tal especificidad sólo tiene sentido si la granularidad de acción es FOR EACH ROW.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Acción Body&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El cuerpo de acción de la instrucción CREATE TRIGGER define la acción de trigger en sí: la instrucción SQL &lt;br /&gt;
que desea que su DBMS ejecute cuando se activa el trigger. El cuerpo de acción puede ser una sentencia SQL &lt;br /&gt;
única o puede ser una serie de instrucciones SQL, delimitadas por punto y coma, con una &lt;br /&gt;
subcláusula BEGIN ATOMIC ... END. Aquí hay dos ejemplos de cuerpos de acción de (el primero muestra un cuerpo&lt;br /&gt;
de acción usando una sola sentencia de SQL y el segundo muestra un cuerpo de acción que muestra &lt;br /&gt;
varias sentencias de SQL):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
... UPDATE Table_1&lt;br /&gt;
&lt;br /&gt;
... BEGIN ATOMIC&lt;br /&gt;
      DELETE FROM Table_1;&lt;br /&gt;
      DELETE FROM Table_2;&lt;br /&gt;
      DELETE FROM Table_3;&lt;br /&gt;
  END&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La acción trigger no puede contener una variable de host o una referencia de parámetro de SQL&lt;br /&gt;
ni puede contener una sentencia de SQL activada que sea una sentencia de transacción de SQL, &lt;br /&gt;
una sentencia de conexión de SQL, una sentencia de SQL Schema o una sentencia de sesión SQL &lt;br /&gt;
Sin embargo, una gran variedad de sentencias SQL son legales dentro del cuerpo del trigger.&lt;br /&gt;
&lt;br /&gt;
Si el tiempo de acción de trigger es ANTES, la acción de trigger puede incluir estas sentencias SQL:&lt;br /&gt;
DECLARE TABLE, DECLARE CURSOR, OPEN, CLOSE, FETCH, SELECT (para una sola fila solamente),&lt;br /&gt;
FREE LOCATOR, HOLD LOCATOR, CALL, RETURN y GET DIAGNOSTICS. También puede nombrar una rutina &lt;br /&gt;
invocada por SQL, siempre y cuando esa rutina no sea una que posiblemente modifique datos SQL&lt;br /&gt;
.&lt;br /&gt;
Si el tiempo de acción del trigger es AFTER, la acción Trigger puede incluir todas las sentencias SQL&lt;br /&gt;
permitidas para BEFORE Triggers, además de: INSERT, UPDATE y DELETE. También puede nombrar cualquier &lt;br /&gt;
rutina invocada por SQL.&lt;br /&gt;
&lt;br /&gt;
De las instrucciones SQL disponibles para una acción de trigger, OPEN, FETCH, CLOSE, SELECT de una&lt;br /&gt;
 sola fila y GET DIAGNOSTICS no son muy útiles porque está prohibido incluir variables y parámetros &lt;br /&gt;
de host dentro del cuerpo de acción de una definición de trigger. INSERT, UPDATE y DELETE son mucho &lt;br /&gt;
más útiles; A menudo un cuerpo de acción de trigger consiste en sólo una de dichas sentencias de &lt;br /&gt;
cambio de datos de SQL. (Recuerda, sin embargo, que no puedes usarlos con un BEFORE Trigger.) &lt;br /&gt;
Las rutinas invocadas por SQL también son útiles. En efecto, un procedimiento en su programa de &lt;br /&gt;
lenguaje de host puede ser llamado por un Trigger.&lt;br /&gt;
&lt;br /&gt;
Si desea restringir su código a Core SQL, no utilice la instrucción CREATE TRIGGER.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Events&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El evento puede ser INSERT, UPDATE o DELETE. El trigger se puede ejecutar ANTES o DESPUÉS del evento. &lt;br /&gt;
Cada tabla sólo puede tener un trigger definido para cada combinación de EVENT/TIMING: por ejemplo, &lt;br /&gt;
una tabla sólo puede tener un trigger BEFORE INSERT&lt;br /&gt;
&lt;br /&gt;
Los LOAD DATA INFILE y LOAD XML instrucciones Invocar triggers INSERT para cada fila que se está insertando.&lt;br /&gt;
La instrucción REPLACE se ejecuta con el siguiente flujo de trabajo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;BEFORE INSERT;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;BEFORE DELETE (Sólo si está eliminando una file);&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;AFTER DELETE (Sólo si está eliminando una file);&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;AFTER INSERT.&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El INSERT ... ON DUPLICATE KEY UPDATE instrucción, cuando ya existe una fila, sigue el siguiente flujo de trabajo:&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;BEFORE INSERT;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;BEFORE UPDATE;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;AFTER UPDATE.&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De lo contrario, funciona como una instrucción INSERT normal.&lt;br /&gt;
Tenga en cuenta que TRUNCATE TABLE no activa ningún trigger.&lt;br /&gt;
&lt;br /&gt;
== Triggers y Errores ==&lt;br /&gt;
&lt;br /&gt;
Con motores de almacenamiento no transaccionales, si una instrucción BEFORE produce un error, &lt;br /&gt;
la sentencia no se ejecutará. Las sentencias que afectan a varias filas fallarán antes de &lt;br /&gt;
insertar la fila actual.&lt;br /&gt;
&lt;br /&gt;
Con los motores transaccionales, los triggers se ejecutan en la misma transacción que la &lt;br /&gt;
sentencia que los invocó.&lt;br /&gt;
&lt;br /&gt;
Si se emite una advertencia con la sentencia SIGNAL o RESIGNAL (es decir, un error con un &lt;br /&gt;
SQLSTATE que comienza con &amp;#039;01&amp;#039;), se tratará como un error.&lt;br /&gt;
&lt;br /&gt;
== Crear un Trigger ==&lt;br /&gt;
Aquí hay un ejemplo sencillo para demostrar un trigger en acción. Utilizando estas &lt;br /&gt;
dos tablas como ejemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Animales( ID mediumint(9) NOT NULL AUTO_INCREMENT, &lt;br /&gt;
                       Nombre char(30) NOT NULL, &lt;br /&gt;
                       PRIMARY KEY (`ID`));&lt;br /&gt;
&lt;br /&gt;
Query OK, 0 rows affected (0.39 sec)&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE ConteoDeAnimales( Animales int);&lt;br /&gt;
&lt;br /&gt;
Query OK, 0 rows affected (0.31 sec)&lt;br /&gt;
&lt;br /&gt;
INSERT INTO ConteoDeAnimales( Animales) VALUES( 0 );&lt;br /&gt;
&lt;br /&gt;
Query OK, 1 row affected (0.05 sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Queremos incrementar un contador cada vez que se añade un nuevo animal.&lt;br /&gt;
Esto es lo que el trigger se verá así:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TRIGGER IncrementoConteoDeAnimales&lt;br /&gt;
  AFTER INSERT ON Animales&lt;br /&gt;
  FOR EACH ROW &lt;br /&gt;
  UPDATE ConteoDeAnimales SET ConteoDeAnimales.Animales = ConteoDeAnimales.Animales + 1;&lt;br /&gt;
&lt;br /&gt;
Query OK, 0 rows affected (0.10 sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este trigger tiene:&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Un &amp;lt;em&amp;gt;nombre&amp;lt;/em&amp;gt; (en este caso: IncrementoConteoDeAnimales)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Un trigger tiempo (en este cso: &amp;lt;em&amp;gt;after&amp;lt;/em&amp;gt; el evento especificado)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Un trigger evento (un INSERT)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Una tabla con la que está asociada: Animales)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Instrucciones para ejecutar (En este caso solo un UPDATE instrucción)&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
AFTER INSERT especifica que el trigger ejecutará &amp;lt;em&amp;gt; después de un INSERT. &lt;br /&gt;
El trigger también podría configurarse para ejecutarse antes, y la sentencia &lt;br /&gt;
que provoca el trigger podría ser una DELETE o UPDATE también.&lt;br /&gt;
&lt;br /&gt;
AFTER INSERT especifica que el trigger ejecutará después de un INSERT. &lt;br /&gt;
El trigger también podría configurarse para ejecutarse antes, y la sentencia &lt;br /&gt;
que provoca el trigger podría ser una DELETE o UPDATE también.&lt;br /&gt;
&lt;br /&gt;
Ahora, si insertamos un registro en la tabla Animales, el trigger se ejecutará, &lt;br /&gt;
incrementando la tabla ConteoDeAnimales;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM ConteoDeAnimales;&lt;br /&gt;
+----------+&lt;br /&gt;
| Animales |&lt;br /&gt;
+----------+&lt;br /&gt;
|        0 |&lt;br /&gt;
+----------+&lt;br /&gt;
1 row in set (0.00 sec)&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Animales (Nombre) VALUES(&amp;#039;aardvark&amp;#039;);&lt;br /&gt;
Query OK, 1 row affected (0.09 sec)&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Animales (Nombre) VALUES(&amp;#039;baboon&amp;#039;);&lt;br /&gt;
Query OK, 1 row affected (0.10 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [MiPrueba1]&amp;gt; SELECT * FROM ConteoDeAnimales;&lt;br /&gt;
+----------+&lt;br /&gt;
| Animales |&lt;br /&gt;
+----------+&lt;br /&gt;
|        2 |&lt;br /&gt;
+----------+&lt;br /&gt;
1 row in set (0.00 sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Triggers metadata&amp;lt;/h2&amp;gt;&lt;br /&gt;
The Information Schema TRIGGERS Table stores information about triggers.&lt;br /&gt;
The SHOW TRIGGERS statement returns similar information.&lt;br /&gt;
The SHOW CREATE TRIGGER statement returns a CREATE TRIGGER statement that creates the given trigger&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MariaDB [MiPrueba1]&amp;gt; show triggers \G;&lt;br /&gt;
*************************** 1. row ***************************&lt;br /&gt;
             Trigger: IncrementoConteoDeAnimales&lt;br /&gt;
               Event: INSERT&lt;br /&gt;
               Table: Animales&lt;br /&gt;
           Statement: UPDATE ConteoDeAnimales SET ConteoDeAnimales.Animales = ConteoDeAnimales.Animales + 1&lt;br /&gt;
              Timing: AFTER&lt;br /&gt;
             Created: NULL&lt;br /&gt;
            sql_mode: &lt;br /&gt;
             Definer: root@localhost&lt;br /&gt;
character_set_client: utf8&lt;br /&gt;
collation_connection: utf8_general_ci&lt;br /&gt;
  Database Collation: utf8_unicode_ci&lt;br /&gt;
1 row in set (0.00 sec)&lt;br /&gt;
&lt;br /&gt;
MariaDB [MiPrueba1]&amp;gt; SHOW CREATE TRIGGER IncrementoConteoDeAnimales \G;&lt;br /&gt;
*************************** 1. row ***************************&lt;br /&gt;
               Trigger: IncrementoConteoDeAnimales&lt;br /&gt;
              sql_mode: &lt;br /&gt;
SQL Original Statement: CREATE DEFINER=`root`@`localhost` TRIGGER IncrementoConteoDeAnimales&lt;br /&gt;
  AFTER INSERT ON Animales&lt;br /&gt;
  FOR EACH ROW &lt;br /&gt;
  UPDATE ConteoDeAnimales SET ConteoDeAnimales.Animales = ConteoDeAnimales.Animales + 1&lt;br /&gt;
  character_set_client: utf8&lt;br /&gt;
  collation_connection: utf8_general_ci&lt;br /&gt;
    Database Collation: utf8_unicode_ci&lt;br /&gt;
1 row in set (0.00 sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Borrar un Trigger ==&lt;br /&gt;
Para borrar un trigger, utilice la declaración DROP TRIGGER. Los triggers también se eliminan&lt;br /&gt;
si la tabla con la que están asociados también se ha eliminado.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
DROP TRIGGER IncrementoConteoDeAnimales;&lt;br /&gt;
Query OK, 0 rows affected (0.01 sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;More complex triggers&amp;lt;/h2&amp;gt;&lt;br /&gt;
Los triggers pueden consistir en varias sentencias incluidas por un &lt;br /&gt;
BEGIN y END. Si está ingresando varias sentencias en la línea de comandos, &lt;br /&gt;
deseará establecer temporalmente un nuevo delimitador para que pueda &lt;br /&gt;
utilizar un punto y coma para delimitar las sentencias dentro del trigger.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DROP TABLE Animales;&lt;br /&gt;
Query OK, 0 rows affected (0.15 sec)&lt;br /&gt;
&lt;br /&gt;
UPDATE ConteoDeAnimales SET Animales = 0;&lt;br /&gt;
Query OK, 1 row affected (0.08 sec)&lt;br /&gt;
Rows matched: 1  Changed: 1  Warnings: 0&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Animales( ID mediumint(9) NOT NULL AUTO_INCREMENT, &lt;br /&gt;
                       Nombre char(30) NOT NULL, &lt;br /&gt;
                       PRIMARY KEY (`ID`)) &lt;br /&gt;
                       ENGINE=InnoDB;&lt;br /&gt;
Query OK, 0 rows affected (0.37 sec)&lt;br /&gt;
&lt;br /&gt;
DELIMITER //&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER LosRatonesInvaden&lt;br /&gt;
  AFTER INSERT ON Animales&lt;br /&gt;
  FOR EACH ROW&lt;br /&gt;
  BEGIN&lt;br /&gt;
    IF NEW.Nombre = &amp;#039;Mouse&amp;#039; THEN&lt;br /&gt;
      UPDATE ConteoDeAnimales SET ConteoDeAnimales.Animales = ConteoDeAnimales.Animales + 100;&lt;br /&gt;
    ELSE &lt;br /&gt;
      UPDATE ConteoDeAnimales SET ConteoDeAnimales.Animales = ConteoDeAnimales.Animales + 1;&lt;br /&gt;
    END IF;&lt;br /&gt;
  END; //&lt;br /&gt;
Query OK, 0 rows affected (0.08 sec)&lt;br /&gt;
&lt;br /&gt;
DELIMITER ;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ConteoDeAnimales;&lt;br /&gt;
+----------+&lt;br /&gt;
| Animales |&lt;br /&gt;
+----------+&lt;br /&gt;
|        0 |&lt;br /&gt;
+----------+&lt;br /&gt;
1 row in set (0.00 sec)&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Animales (Nombre) VALUES(&amp;#039;Aardvark&amp;#039;);&lt;br /&gt;
Query OK, 1 row affected (0.05 sec)&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ConteoDeAnimales;&lt;br /&gt;
+----------+&lt;br /&gt;
| Animales |&lt;br /&gt;
+----------+&lt;br /&gt;
|        1 |&lt;br /&gt;
+----------+&lt;br /&gt;
1 row in set (0.00 sec)&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Animales (Nombre) VALUES(&amp;#039;Mouse&amp;#039;);&lt;br /&gt;
Query OK, 1 row affected (0.12 sec)&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ConteoDeAnimales;&lt;br /&gt;
+----------+&lt;br /&gt;
| Animales |&lt;br /&gt;
+----------+&lt;br /&gt;
|      101 |&lt;br /&gt;
+----------+&lt;br /&gt;
1 row in set (0.00 sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errores de Trigger ==&lt;br /&gt;
&lt;br /&gt;
Si un trigger contiene un error y el motor es transaccional, o el es un BEFORE trigger, &lt;br /&gt;
no se ejecutará y evitará que se ejecute la sentencia original. Si el motor no es &lt;br /&gt;
transaccional y es un AFTER trigger, el trigger no se ejecutará, pero la instrucción &lt;br /&gt;
original lo hará.&lt;br /&gt;
&lt;br /&gt;
Aquí, eliminaremos los ejemplos anteriores y, a continuación, volveremos a crear &lt;br /&gt;
el trigger con un error, un campo que no existe, usando el InnoDB predeterminado , Un motor transaccional y, de nuevo, utilizando MyISAM un motor no transaccional.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DROP TABLE Animales;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Animales (ID mediumint(9) NOT NULL AUTO_INCREMENT, &lt;br /&gt;
nombre char(30) NOT NULL, &lt;br /&gt;
PRIMARY KEY (`ID`)) &lt;br /&gt;
ENGINE=InnoDB;&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER  IncrementoConteoDeAnimales&lt;br /&gt;
AFTER INSERT ON Animales &lt;br /&gt;
FOR EACH ROW &lt;br /&gt;
UPDATE ConteoDeAnimales SET ConteoDeAnimales.ID = ConteoDeAnimales_id+1;&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Animales (nombre) VALUES( &amp;#039;aardvark&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ERROR 1054 (42S22): Unknown column &amp;#039;ConteoDeAnimales.ID&amp;#039; in &amp;#039;field list&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM animals;&lt;br /&gt;
Empty set (0.00 sec)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y ahora el procedimiento idéntico, pero con una tabla MyISAM&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DROP TABLE Animales;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Animales (ID mediumint(9) NOT NULL AUTO_INCREMENT, &lt;br /&gt;
name char(30) NOT NULL, &lt;br /&gt;
PRIMARY KEY (`ID`)) &lt;br /&gt;
ENGINE=MyISAM;&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER  IncrementoConteoDeAnimales&lt;br /&gt;
AFTER INSERT ON Animales &lt;br /&gt;
FOR EACH ROW &lt;br /&gt;
UPDATE ConteoDeAnimales SET ConteoDeAnimales.ID = ConteoDeAnimales_id+1;&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Animales (name) VALUES(&amp;#039;aardvark&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ERROR 1054 (42S22): Unknown column &amp;#039;animal_count.id&amp;#039; in &amp;#039;field list&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM Animales;&lt;br /&gt;
+----+----------+&lt;br /&gt;
| id | name     |&lt;br /&gt;
+----+----------+&lt;br /&gt;
|  1 | aardvark |&lt;br /&gt;
+----+----------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El ejemplo siguiente muestra cómo utilizar un trigger para validar datos. &lt;br /&gt;
La sentencia SIGNAL se utiliza para producir un error intencionalmente si &lt;br /&gt;
el campo de correo electrónico no es un correo electrónico válido. &lt;br /&gt;
Como muestra el ejemplo, en ese caso la nueva fila no se inserta &lt;br /&gt;
(porque es un BEFORE trigger).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot; line=&amp;quot;GESHI_FANCY_LINE_NUMBERS&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Usuario (&lt;br /&gt;
	ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
	Nombre CHAR(20),&lt;br /&gt;
	Apellido CHAR(20),&lt;br /&gt;
	EMail CHAR(100)&lt;br /&gt;
)&lt;br /&gt;
	ENGINE = MyISAM;&lt;br /&gt;
&lt;br /&gt;
DELIMITER //&lt;br /&gt;
CREATE TRIGGER Bi_Usuario&lt;br /&gt;
  BEFORE INSERT ON Usuario&lt;br /&gt;
  FOR EACH ROW&lt;br /&gt;
BEGIN&lt;br /&gt;
  IF NEW.EMail NOT LIKE &amp;#039;_%@_%.__%&amp;#039; THEN&lt;br /&gt;
    SIGNAL SQLSTATE &amp;#039;45000&amp;#039; SET MESSAGE_TEXT = &amp;#039;EMail campo no está valido&amp;#039;;&lt;br /&gt;
  END IF;&lt;br /&gt;
END; //&lt;br /&gt;
DELIMITER ;&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Usuario (Nombre, Apellido, EMail) VALUES (&amp;#039;Juan&amp;#039;, &amp;#039;Valdez&amp;#039;, &amp;#039;JuanValdez.AlgunLugar.net&amp;#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ERROR 1644 (45000):  EMail campo no está valido&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM Usuario;&lt;br /&gt;
Empty set (0.00 sec)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MariaDB Desde la Consola]]&lt;br /&gt;
[[Category: CursoMatiaDB]]&lt;/div&gt;</summary>
		<author><name>Rrc</name></author>
		
	</entry>
</feed>