Unidad4 Triggers

9
[MySQL Avanzado] De Intecap-TICS [La automatización de las acciones sobre las bases de datos se pueden implementar en el servidor para que se pueda controlar cualquier gestiones sobre la base de datos; los Objetivos de la Unidad son adquirir las competencias de los siguientes contenidos.] Unidad 1 Triggers Unidad 4

Transcript of Unidad4 Triggers

  • [MySQL Avanzado] De Intecap-TICS [La automatizacin de las acciones sobre las bases de datos se pueden implementar en el servidor para que se pueda controlar cualquier gestiones sobre la base de datos; los Objetivos de la Unidad son adquirir las competencias de los siguientes contenidos.]

    Unidad

    1 Triggers

    Unidad 4

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    2

    MMyySSQQLL AAvvaannzzaaddoo

    +-----_---------+ | Triggers | +---------------+

    Los Trigger son un mecanismo muy ligado a los SP. Los triggers son conjuntos de sentencias SQL o SPs que son ejecutados automticamente antes o despus de una modificacin de la base de datos (UPDATE, INSERT, DELETE). Se usan para mantener condiciones sobre los datos de la base de datos y para monitorizar las operaciones.

    Hay que tener en cuenta que un trigger se ejecuta por cada modificacin, as que si las operaciones a realizar automticamente son muy complicadas, puede llevar a una ralentizacin considerable de nuestra aplicacin. Esto se puede dar particularmente cuando se hacen modificaciones a muchos registros al mismo tiempo, ya que se ejecutara un trigger por cada registro modificado.

    Lo que explicaremos a continuacin sobre triggers se aplica solamente a versiones iguales o superiores a 5.1.6.

    Los TRIGGERs son relativamente nuevos en las bases de datos. Aun existen bugs. Por lo tanto se da la misma advertencia que se dio para SP. No trate TRIGGERs en una base de datos que tiene datos importantes para hacer pruebas. En su lugar, crear una nueva base de datos para

    propsitos de prueba, y asegrese de que esta base de datos de prueba es el valor por defecto en uso, cada vez que va a crear o usar tablas con triggers. Para tomar la lectura de esta unidad se sugiere haber tomado la lectura completa de la

    unidad anterior de Stored Procedure, ya que algunos conceptos de esa unidad sern tomados aqu y no se har mayor explicacin de sus sintaxis. En concreto las mismas convenciones para SP se aplican a trigger, estas son:

    Las sentencias compuestas (BEGIN-END) son permitidas. Flujo de control de las declaraciones (IF, CASE, WHILE, LOOP, WHILE, REPEAT) son

    permitidas. Declaracin de variables (DECLARE) y la asignacin (SET) son permitidas. Las declaraciones de condicin son permitidas. Las declaraciones de controlador son permitidas.

    Pero recuerde que las funciones estn sujetas a severas limitaciones: no se puede acceder a las tablas dentro de una funcin. As que las siguientes declaraciones no son permitidas

    dentro de una funcin:

    ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE DROP 'FLUSH PRIVILEGES' GRANT INSET KILL LOCK OPTIMIZE REPAIR REPLACE REVOKE ROLLBACK SAVEPOINT 'SELECT FROM tabla' 'SET variable del sistema' 'SET TRANSACTION' SHOW 'START TRANSACTION' TRUNCATE UPDATE

    Precisamente la misma limitacin se aplica a los TRIGGERs.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    3

    MMyySSQQLL AAvvaannzzaaddoo

    Sintaxis Explicacin por pasos:

    CREATE TRIGGER { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON FOR EACH ROW

    Comentarios 1. CREATE TRIGGER

    Los triggers deben tener nombres, hasta 64 caracteres de longitud, posiblemente, encerrado en los delimitadores de comillas ('). En otras palabras, estos son mucho ms parecidos a los nombres de otros objetos en MySQL.

    Aqu se utilizara una convencin: los nombres de trigger son. Nombre_tabla+'_'+abreviacin_de_trigger Por ejemplo para una tabla T26, su nombre ser: t26_bu.

    2. { BEFORE | AFTER }

    Los disparadores tienen un tiempo de accin y pueden ser activados antes de un evento o despus de un evento.

    3. {INSERT | UPDATE | DELETE}

    Los triggers tambin tienen un evento: se puede activar durante la insercin, o durante la actualizacin o durante el borrado.

    El tipo de accin que activa el trigger viene determinado por evento_trigger. Los valores posibles son:

    INSERT: El trigger se activa cuando se inserta un registro. Esto incluye las instrucciones SQL INSERT, LOAD DATA y REPLACE.

    UPDATE: El trigger se activa cuando se modifica un registro. Esto corresponde a la instruccin SQL UPDATE.

    DELETE: El trigger se activa cuando se borra un registro. Por ejemplo cuando se usan instrucciones SQL como DELETE y REPLACE. Sin embargo, si se borran registro usando DROP TABLE o TRUCATE no se activan estos triggers ya que estas instrucciones no se transforman en DELETE.

    Es importante recalcar que estos tres tipos de eventos no se corresponden con las instrucciones SQL que tienen el mismo nombre, sino que son tipos de eventos que pueden englobar uno o ms tipos de instrucciones SQL.

    Como ejemplo de posible confusin tenemos el siguiente comando:

    INSERT INTO ... ON DUPLICATE KEY UPDATE ...

    A pesar de se un comando INSERT, se pueden producir modificaciones si hay claves duplicados, con lo que, con este solo comando se pueden activar los triggers de tipo INSERT y UPDATE.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    4

    MMyySSQQLL AAvvaannzzaaddoo

    No se pueden tener dos triggers definidos para la misma tabla, al mismo tiempo y utilizando el mismo evento. Por ejemplo, para una tabla solo puede haber un trigger del tipo BEFORE INSERT.

    La accin SQL que se ejecuta si se activa el trigger es sentencia_trigger. Si se quieren ejecutar varias instrucciones SQL se puede usar BEGIN-END. Eso quiere decir que se puede usar la misma sintaxis que para los procedimientos almacenados (SP). De todas maneras, hay una serie de restricciones para los triggers en relacin a las instrucciones que estn permitidas. Las ms importantes son:

    LOCK TABLES, UNLOCK TABLES. LOAD DATA, LOAD TABLE. No se pueden hacer commit ni rollback.

    1. ON

    Los triggers tienen una tabla sujeto: se trata de inserciones o actualizaciones o eliminaciones en la tabla sujeto que causan la activacin. No puedo hacer dos triggers de la misma tabla y

    con el mismo evento. 2. FOR EACH ROW

    Los triggers tienen una granularidad: FOR EACH ROW, dice que la activacin del trigger se

    producir por las filas de la tabla, no para la tabla en su conjunto. 3.

    Los triggers tiene declaracin provocada por sentencias SQL: la instruccin puede ser cualquier sentencia, incluyendo una sentencia compuesta, pero los triggers tienen todas las

    mismas limitaciones que las funciones. Privilegios

    Usted necesitar actuar como administrador (usuario root) para crear un TRIGGER. Este es un requisito no estndar, aunque un usuario con todos los privilegios tambin puede crear triggers. Veamos entonces como funciona un trigger.

    Consulta-ejemplo 5.1: Para ejemplificar el uso de un trigger, crear una base de datos de prueba de nombre DB6.

    Consulta-ejemplo 5.2: Con la base de datos DB6, crear las tablas: test1, test2, test3; y test4, como se muestra a continuacin Mysql> CREATE TABLE test1(a1 INT);

    Mysql> CREATE TABLE test2(a2 INT);

    Mysql> CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);

    Mysql> CREATE TABLE test4(a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> b4 INT DEFAULT 0);

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    5

    MMyySSQQLL AAvvaannzzaaddoo

    Consulta-ejemplo 5.3: cambie el delimitador de MySQL por |, este procedimiento es similar al expuesto en la unidad anterior de SP. Mysql> DELIMITER |

    Debido a que un trigger no hay que mandarlo a llamar, y como el trigger que crearemos de ejemplo se ejecutara antes (BEFORE) que se cumpla la accin, primero lo vamos a crear y lo explicaremos cuando se ejecute. Es decir iremos de atrs para adelante para explicar como funciona este trigger.

    Consulta-ejemplo 5.4: crear el siguiente trigger Mysql> CREATE TRIGGER testref BEFORE INSERT ON test1 -> FOR EACH ROW BEGIN -> INSERT INTO test2 SET a2 = NEW.a1; -> DELETE FROM test3 WHERE a3 = NEW.a1; -> UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; -> END;|

    Consulta-ejemplo 5.5: cambie al delimitador por default de MySQL Mysql> DELIMITER ;

    Consulta-ejemplo 5.6: Realizar los siguiente registros a la tabla test3, y test4. mysql> INSERT INTO test3 (a3) VALUES -> (NULL), (NULL), (NULL), (NULL), (NULL), -> (NULL), (NULL), (NULL), (NULL), (NULL);

    -> INSERT INTO test4 (a4) VALUES -> (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);

    Consulta-ejemplo 5.7: Realizar los siguiente registros a la tabla test1 mysql> INSERT INTO test1 VALUES (1), (3), (1), (7), (1), (8), (4), (4);

    Query OK, 8 rows affected (0.04 sec) Records: 8 Duplicates: 0 Warnings: 0

    Comentarios En esta ltimas consulta-ejemplo 5.6 y 5.7, al haberse producido INSERTs en la tabla test1, el trigger testref se ha activado para cada uno de los INSERTS. Veamos si se ha ejecutado

    correctamente (Nota: no explicaremos las sentencias SQL de las consultas bsicas que se han visto en los cursos anteriores):

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    6

    MMyySSQQLL AAvvaannzzaaddoo

    Consulta-ejemplo 5.8: Verifique los registros de la tabla test1. mysql> SELECT * FROM test1;

    +------+ | a1 | +------+ | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | | 4 | +------+

    Comentario La tabla test1, evidentemente, contiene los valores que hemos insertado directamente. Consulta-ejemplo 5.9: Hacer una consulta de la tabla test2. mysql> SELECT * FROM test2;

    +------+ | a2 | +------+ | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | | 4 | +------+

    Comentario Note que la tabla se ha afectado, y a quedado a como se muestra en la consulta. Esto es debido a

    que el trigger lo nico que hace es insertar un registro en test2 en la columna a2 y contiene los mismo que la columna a1 del nuevo registro (NEW.a1) que se esta a punto de insertar. Consulta-ejemplo 5.10: Ahora hacer una consulta de la tabla test3.

    mysql> SELECT * FROM test3;

    +----+ | a3 | +----+ | 2 | | 5 | | 6 | | 9 | | 10 | +----+

    Comentarios

    La tabla test3 se haba inicializado insertando registro con valor NULL, pero al ser su columna a3 de tipo NOT NULL PRIMARY KEY, el sistema inicializo los valores de esta columna con 1, 2,3,... 10. Al ejecutarse el segundo INSERT, el que activa los triggers, cada vez que se inserta un registro en

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    7

    MMyySSQQLL AAvvaannzzaaddoo

    test1, se borran todos los registro de test3 cuya columna a3 es igual a la columna a1 del registro que se esta a punto de insertar. Y finalmente veamos como ha quedado la tabla test4

    Consulta-ejemplo 5.11: Ahora hacer una consulta de la tabla test4. mysql> SELECT * FROM test4;

    +----+------+ | a4 | b4 | +----+------+ | 1 | 3 | | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 0 | | 6 | 0 | | 7 | 1 | | 8 | 1 | | 9 | 0 | | 10 | 0 | +----+------+

    Comentarios

    Si nos fijamos en la instruccin del trigger que afecta a la tabla test4, veremos que lo nico que hace es contar cuantos registros insertados contienen el valor 1 en a1, el valor 2, y as sucesivamente.

    Para referirnos al registro que se va a insertar o modificar en un trigger BEFORE podemos usar NEW, y para referirnos al registro que se ha borrado o modificado en un trigger AFTER podemos usar OLD.

    Tambin podemos alterar un registro que se va a insertar o modificar. Por ejemplo:

    CREATE TRIGGER insertar-dato BEFORE INSERT ON `la-misma-tabla` FOR EACH ROW BEGIN SET NEW.guid = UUID(); END;

    Sin embargo, esto solo esta permitido cuando el trigger es de tipo BEFORE. Si lo usamos en uno

    AFTER obtendr un error. Un punto importante a tener en cuenta es el uso de triggers BEFORE con tablas InnoDB. Si se han definido restricciones, puede ser que determinados INSERT fallen debido a dichas restricciones,

    pero los triggers si que se activan. Por eso es recomendable usar triggers de tipo AFTER siempre que sea posible. Borrar triggers

    Para borrar un trigger existente ejecutar DROP TRIGGER. Es necesario especificar la tabla a la que esta asociado:

    DROP TRIGGER nombre__trigger; Veamos otro tipo de cosas que se pueden hacer con los trigger.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    8

    MMyySSQQLL AAvvaannzzaaddoo

    Para los ejemplos a continuacin vamos a cambiar el delimitador nuevamente a //, con la finalidad de diferenciar los ejemplos. Consulta-ejemplo 5.12: En la base de datos DB6, creada anteriormente, crear la tabla t22.

    Mysql> CREATE TABLE t22 (s1 INT)//

    Nuevamente vamos a crear un trigger y lo explicaremos una vez ejecutado. Es decir iremos de atrs para adelante para explicar como funciona este trigger.

    Consulta-ejemplo 5.: Crear el siguiente trigger en su DBMS. Mysql> CREATE TRIGGER t22_bi -> BEFORE INSERT ON t22 -> FOR EACH ROW -> BEGIN -> SET @x = 'El Trigger fue activado!'; -> SET NEW.s1 = 55; -> END;//

    Comentarios

    Note que se empez por la creacin de una tabla de prueba llamado t22. Luego se creo el trigger para la tabla t22, de modo que antes de insertar cualquier fila en la tabla, hay una bandera (x) que el trigger activa, y cambiar el valor de columna por uno nuevo (55), en la tabla.

    Veamos si funciona el trigger. Consulta-ejemplo 5.: Realizar un registro en la tabla t22 la cual tiene asignado un trigger. mysql> INSERT INTO t22 VALUES (1)//

    Comentarios La sentencia INSERT es totalmente normal. No es necesario tener "privilegios en el trigger". Ni

    siquiera se tienen que saber que existe el trigger. Verificando los registros en t22 para ver como funciono el trigger.

    Consulta-ejemplo 5.: Hacer una consulta de toda la tabla t22. mysql> SELECT @x, t22.* FROM t22//

    + ------------------------ + ------ + | @ X | S1 | + ------------------------ + ------ + | El Trigger fue activado! | 55 | + ------------------------ + ------ +

    Comentario Aqu vemos lo que ocurre como resultado de la insercin. La bandera x est establecida, como se esperaba. Y el valor que realmente se ha insertado no es el que se ha establecido en la INSERT.

    En cambio, el valor es lo que se ha establecido en el trigger.

  • M

    ySQ

    L e

    s S

    oft

    ware

    Lib

    re

    9

    MMyySSQQLL AAvvaannzzaaddoo

    Lo ms importante a tener en cuenta de los triggers es que estos no necesitan ser llamados por el usuario, a diferencias de los SP. Nota al estudiante: Complemente el uso de los Trigger con los Stored Procedure, y volver

    altamente eficiente su base de datos, sin embargo no olvide que estas herramientas son relativamente nuevas y pueden haber cambios en cuanto a la sintaxis en un futuro; actualmente se esta buscando que cumplan con los estndares SQL2003. Comentarios finales

    Nota del autor: No piense que lo que ha aprendido en estos tres cursos de MySQL (bsico, intermedio, y

    avanzado) es todo lo que usted debe saber sobre bases de datos, djeme decirle que no es ni el 1% sobre el tema, las bases de datos se trabajan a todo nivel, por ejemplo: arquitectura, diseo, esquema, servidor, seguridad, administracin, gestin, etc., y para cada uno existen distintos tipos de profesionales, por lo que recomiendo seguir instruyndose e investigando en el tema de

    bases de datos, para cualquiera que sea, el tipo de software de bases de datos que en el mercado actual y que decida utilizar. Muchas gracias. BIBLIOGRAFIAS

    1. FUNDAMENTOS DE BASES DE DATOS. Abraham S. Henry F. Cuarta edicin. McGraw-

    Hill. Mxico. 2008.

    2. Beginning Oracle SQL. Oracle Lex de Haan Et.Al Apress. USA. 2009.

    3. http://dev.mysql.com/doc/refman/5.6/en/ MySQL 5.6 Reference Manual