Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Triggers BD

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 11

Universidad Politécnica de Chiapas

Ing. Biomédica

Práctica SQL

Base de Datos

Alumnos:
Juárez Castro Flavio Alfonso (183126)
Palacios Flores Alejandra (183143)

6to “A”

23 de junio de 2020
OBJETIVO GENERAL
Conocer que es y cómo funciona un Trigger en MaríaDB.

OBJETIVOS ESPECÍFICOS
▪ Aprender qué es un trigger y dominar su sintaxis.
▪ Aplicar la teoría aprendida con la implementación de triggers en el aula de clase.

INTRODUCCIÓN

Además de los bloques PL/SQL anónimos utilizados por SQL*PLus o por las herramientas
de desarrollo, se puede emplear código PL/SQL en determinados objetos de la base de datos,
como los procedimientos almacenados (PROCEDURE, FUNCTION, PACKAGE) y los
disparadores (TRIGGER) de la base de datos.
Un disparador define una acción que la base de datos debe llevar a cabo cuando se produce
algún suceso relacionado con la misma. Los disparadores (triggers) pueden utilizarse para
completar la integridad referencial, también para imponer reglas de negocio complejas o para
auditar cambios en los datos. El código contenido en un disparador, denominado cuerpo del
disparador, está formado por bloques PL/SQL. La ejecución de disparadores es transparente
al usuario.
En definitiva, los disparadores son eventos a nivel de tabla que se ejecutan automáticamente
cuando se realizan ciertas operaciones sobre la tabla.
En la siguiente investigación se desea mostrar la definición y aplicación de un programa
almacenado en la base de datos de MaríaDB, con el fin de facilitar el uso en diversas áreas.
¿QUÉ ES UN TRIGGER?

Desde la aparición de la versión 5.0.3 de la base de datos MySQL, se ha implementado la


posibilidad de desarrollar triggers para las tablas de una base de datos.
Recordar que un trigger es un objeto asociado a una tabla que es ejecutado cuando sucede
un evento en la tabla propietaria. Son aquellas sentencias (INSERT, UPDATE, DELETE)
que modifican los datos dentro de una tabla. Sólo puede haber un trigger de cada insert,
update y delete por tabla o vista. Pero los triggers tienen una ventaja obvia. Es código que se
ejecuta en el servidor de la base de datos, y no en la máquina cliente.

Un Trigger o Disparador es un programa almacenado (stored programo SP), creado para


ejecutarse automáticamente cuando ocurra un evento en una tabla o vista de la base de datos.
Dichos eventos son generados por los comandos INSERT, UPDATE y DELETE, los cuales
forman parte del DM (Data Modeling Language) de SQL.

Los triggers o disparadores de MySQL son usa serie de reglas predefinidas que están
asociadas a una tabla. Estas reglas permiten la ejecución de una serie de instrucciones cuando
se producen ciertos eventos como pueden ser la inserción de un nuevo registro, la
actualización o el borrado de los datos de una tabla.

Un Disparador nunca se llama directamente, en cambio, cuando una aplicación o usuario


intenta insertar, actualizar, o anular una fila en una tabla, la acción definida en el disparador
se ejecuta automáticamente (se dispara).

CARACTERÍSTICAS
Son usados para mejorar la administración de la Base de datos, sin necesidad de
contar con que el usuario ejecute la sentencia de SQL.
Además, pueden generar valores de columnas, previene errores de datos, sincroniza
tablas, modifica valores de una vista, etc.
Permite implementar programas basados en paradigma lógico (sistemas expertos,
deducción).
Los disparadores son soportados en MySQL a partir de la versión 5.0.2. Algunos de
los soportes existentes son los disparadores para las sentencias INSERT, UPDATE y
DELETE

Las ventajas de los triggers son varias:

La entrada en vigor automática de restricciones de los datos, hace que los usuarios
entren sólo valores válidos.
El mantenimiento de la aplicación se reduce, los cambios a un disparador se reflejan
automáticamente en todas las aplicaciones que tienen que ver con la tabla sin la
necesidad de recompilar o enlazar.
Logs automáticos de cambios a las tablas. Una aplicación puede guardar un registro
corriente de cambios, creando un disparador que se active siempre que una tabla se
modifique.
La notificación automática de cambios a la Base de Datos con alertas de evento en
los disparadores. Decimos que los Triggers se invocan para ejecutar un conjunto de
instrucciones que protejan, restrinjan, actualicen o preparen la información de las
tablas, al momento de manipular la información. Para crear triggers son necesarios
los privilegios SUPER y TRIGGER.

Desventajas:

Hay que definir con anticipación la tarea que realizara el trigger.


Peligro de pérdida en Reorganizaciones.
Hay que programarlos para cada DBMS.
Un Trigger nunca se llama directamente.
Los triggers no se desarrollan pensando en un sólo registro, los mismos deben
funcionar en conjunto con los datos ya que se disparan por operación y no por
registro.
Por funcionalidad, no hay que poner en uno solo las funciones de INSERT, UPDATE
y DELETE.
Utilizar moderadamente los triggers.
No se pueden utilizar en tablas temporales.
MODOS DE EMPLEO
Registrar, auditar y monitorear la actividad de cambios de datos.
Validad datos, cambiando o negando acciones como insert, update, delete en una
tabla.
Preservar la consistencia y claridad de los datos ejecutando acciones relacionadas
con otras tablas

SINTAXIS DE UN TRIGGER
Usamos la siguiente sintaxis:
CREATE [DEFINER={usuario|CURRENT_USER}]
TRIGGER nombre_del_trigger {BEFORE|AFTER} {UPDATE|INSERT|DELETE}
ON nombre_de_la_tabla
FOR EACH ROW
<bloque_de_instrucciones>

Obviamente la sentencia CREATE es conocida para crear nuevos objetos en la base de datos.
Explicación de las partes de la definición:
▪ DEFINER={usuario|CURRENT_USER}: Indica al gestor de bases de datos qué
usuario tiene privilegios en su cuenta, para la invocación de los triggers cuando surjan
los eventos DML. Por defecto esta característica tiene el valor CURRENT_USER
que hace referencia al usuario actual que está creando el Trigger.
▪ nombre_del_trigger: Indica el nombre del trigger. Por defecto existe una
nomenclatura práctica para nombrar un trigger, la cual da mejor legibilidad en la
administración de la base de datos.
Primero, escriba el nombre de tabla, luego especifique con la inicial de la operación
DML y seguido usamos la inicial del momento de ejecución (AFTER o BEFORE).
Por ejemplo: BEFORE INSERT clientes_BI_TRIGGER
▪ BEFORE|AFTER: Especifica si el Trigger se ejecuta antes o después del evento
DML.
▪ UPDATE|INSERT|DELETE: Aquí elija que sentencia usa para que se ejecute el
Trigger.
▪ ON nombre_de_la_tabla: En esta sección establece el nombre de la tabla asociada.
▪ FOR EACH ROW: Establece que el Trigger se ejecute por cada fila en la tabla
asociada.
▪ <Bloque_De_intrucciones> : Define el bloque de sentencias que el Trigger ejecuta
al ser invocado.

IDENTIFICADORES NEW Y OLD EN TRIGGERS


Si queremos relacionar el trigger con columnas específicas de una tabla debemos usar los
identificadores OLD y NEW. OLD indica el valor antiguo de la columna y NEW el valor
nuevo que pudiese tomar. Por ejemplo: OLD.idproducto ó NEW.idproducto. Si usamos
la sentencia UPDATE podremos referirnos a un valor OLD y NEW, ya que modificaremos
registros existentes por nuevos valores. En cambio, sí usamos INSERT solo usaremos NEW,
ya que su naturaleza es únicamente de insertar nuevos valores a las columnas. Y si usamos
DELETE usaremos OLD debido a que borraremos valores que existen con anterioridad

TRIGGERS BEFORE Y AFTER


Estas cláusulas indican si el Trigger se ejecuta antes o después del evento DML. Hay ciertos
eventos que no son compatibles con estas sentencias. Por ejemplo, si tuvieras un Trigger
AFTER que se ejecuta en una sentencia UPDATE, sería ilógico editar valores nuevos NEW,
sabiendo que el evento ya ocurrió. Igual sucedería con la sentencia INSERT, el Trigger
tampoco podría referenciar valores NEW, ya que los valores que en algún momento fueron
NEW, han pasado a ser OLD.

¿QUÉ UTILIDADES TIENEN LOS TRIGGERS?


Con los Triggers podemos implementar varios casos de uso que mantengan la integridad de
la base de datos, como Validar información, Calcular atributos derivados, Seguimientos de
movimientos en la base de datos, etc. Cuando surja una necesidad en donde veas que
necesitas que se ejecute una acción implícitamente (sin que la ejecutes manualmente) sobre
los registros de una tabla, entonces puedes considerar el uso de un Trigger.
APLICACIONES
Ejemplo de Trigger BEFORE en la sentencia UPDATE

A continuación, veremos un Trigger que valida la edad de un cliente antes de una sentencia
UPDATE. Si por casualidad el nuevo valor es negativo, entonces asignaremos NULL a este
atributo.

: DELIMITER //3
CREATE TRIGGER cliente_BU_Trigger
BEFORE UPDATE ON cliente FOR EACH ROW
BEGIN
-- La edad es negativa?
IF NEW.edad<0 THEN
SET NEW.edad = NULL;
END IF;
END// DELIMITER;
Este Trigger se ejecuta antes de haber insertado el registro, lo que nos da el poder de
verificar primero si el nuevo valor de la edad está en el rango apropiado, si no es así
entonces asignaremos NULL a ese campo. ¡Grandes los Triggers!

Ejemplo de Trigger AFTER en la sentencia UPDATE

Supongamos que tenemos una Tienda de accesorios para Gamers. Para la actividad de
nuestro negocio hemos creado un sistema de facturación muy sencillo, que registra las ventas
realizadas dentro de una factura que contiene el detalle de las compras. Nuestra tienda tiene
4 vendedores de turno, los cuales se encargan de registrar las compras de los clientes en el
horario de funcionamiento. Implementaremos un Trigger que guarde los cambios realizados
sobre la tabla DETALLE_FACTURA de la base de datos realizados por los vendedores.

DELIMITER //
CREATE TRIGGER detalle_factura_AU_Trigger
AFTER UPDATE ON detalle_factura FOR EACH ROW
BEGIN
INSERT INTO log_updates
(idusuario, descripcion)
VALUES (user( ),
CONCAT('Se modificó el registro ','(',
OLD.iddetalle,',', OLD.idfactura,',',OLD.idproducto,',',
OLD.precio,',', OLD.unidades,') por ',
'(', NEW.iddetalle,',', NEW.idfactura,',',NEW.idproducto,',',
NEW.precio,',', NEW.unidades,')'));
END//
DELIMITER ;
Con este registro de logs podremos saber si algún vendedor “ocioso” está alterando las
facturas, lo que lógicamente sería atentar contra las finanzas de nuestro negocio. Cada
registro nos informa el usuario que modificó la tabla DETALLE_FACTURA y muestra una
descripción sobre los cambios en cada columna.

Ejemplo de Trigger BEFORE en la sentencia INSERT

El siguiente ejemplo que te voy a mostrar ¡me encanta!, ya que muestra cómo mantener la
integridad de una base de datos con respecto a un atributo derivado.

Supón que tienes una Tienda de electrodomésticos y que has implementado un sistema de
facturación. En la base de datos que soporta la información de tu negocio, existen varias
tablas, pero nos vamos a centrar en la tabla PEDIDO y la tabla TOTAL_VENTAS.
TOTAL_VENTAS almacena las ventas totales que se le han hecho a cada cliente del negocio.
Es decir, si el cliente Armado Barreras en una ocasión compró 1000 dólares, luego compró
1250 dólares y hace poco ha vuelto a comprar 2000 dólares, entonces el total vendido a este
cliente es de 4250 dólares. Pero supongamos que eliminamos el ultimo pedido hecho por este
cliente, ¿qué pasaría con el registro en TOTAL_VENTAS ?,exacto!, quedaría
desactualizado. Usaremos tres Triggers para solucionar esta situación. Para que cada vez que
usemos un comando DML en la tabla PEDIDO, no tengamos que preocuparnos por actualizar
manualmente TOTAL_VENTAS.

TRIGGER PARA INSERT


DELIMITER //
CREATE TRIGGER PEDIDO_BI_TRIGGER
BEFORE INSERT ON PEDIDO
FOR EACH ROW
BEGIN
DECLARE cantidad_filas INT;
SELECT COUNT(*)
INTO cantidad_filas
FROM TOTAL_VENTAS
WHERE idcliente=NEW.idcliente;
IF cantidad_filas > 0 THEN
UPDATE TOTAL_VENTAS
SET total=total+NEW.total
WHERE idcliente=NEW.idcliente;
ELSE
INSERT INTO TOTAL_VENTAS
(idcliente,total)
VALUES(NEW.idcliente,NEW.total);
END IF;
END//
-- TRIGGER PARA UPDATE
CREATE TRIGGER PEDIDO_BU_TRIGGER
BEFORE UPDATE ON PEDIDO
FOR EACH ROW
BEGIN
UPDATE TOTAL_VENTAS
SET total=total+(NEW.total-OLD.total)
WHERE idcliente=NEW.idcliente;
END//
-- TRIGGER PARA DELETE
CREATE TRIGGER PEDIDO_BD_TRIGGER
BEFORE DELETE ON PEDIDO
FOR EACH ROW
BEGIN
UPDATE TOTAL_VENTAS
SET total=total-OLD.total
WHERE idcliente=OLD.idcliente;
END//
Con todos ellos mantendremos el total de ventas de cada cliente actualizado dependiendo del
evento realizado sobre un pedido. Si insertamos un nuevo pedido generado por un cliente
existente, entonces vamos rápidamente a la tabla TOTAL_VENTAS y actualizamos el total
comprado por ese cliente con una sencilla suma acumulativa. Ahora, si cambiamos el monto
de un pedido, entonces vamos a TOTAL_VENTAS para descontar el monto anterior y
adicionar el nuevo monto. Y si eliminamos un pedido de un cliente simplemente descontamos
del total acumulado el monto que con anterioridad habíamos acumulado.

Ver la información de un Trigger

Usa el comando SHOW CREATE TRIGGER y rápidamente estarás viéndolas


especificaciones de tu Trigger creado. Observa el siguiente ejemplo: SHOW CREATE TRIGGER
futbolista_ai_trigger; También puedes ver los Triggers que hay en tu base de datos
con: SHOW TRIGGERS;

Eliminar un Trigger
Como ya sabes usamos este comando para eliminar casi cualquier cosa en nuestra base de
datos: DROP TRIGGER [IF EXISTS] nombre_trigger
Recuerda que podemos adicionar la condicion IF EXISTS para indica que si el Trigger ya
existe, entonces que lo borre.
TIPOS DE TRIGGER
Existen dos tipos de disparadores que se clasifican según la cantidad de ejecuciones a
realizar:
Row Triggers (o disparadores de fila): son aquellos que se ejecutaran n veces si se
llaman n-veces desde la tabla asociada al trigger.
Statement Triggers (o disparadores de secuencia): son aquellos que sin importar la
cantidad de veces que se cumpla con la condición, su ejecución es única.
CONCLUSIÓN

Concluimos que un trigger es una clase especial de procedimiento almacenado


que se ejecuta automáticamente cuando se produce un evento en el servidor de bases de datos,
solo se pueden aplicar a una tabla específica, es decir, un trigger no sirve para dos o más
tablas. De acuerdo a lo que se observó durante la lectura de la investigación es recomendable
estudiar bien la sintaxis de un trigger para no confundirnos ya que en la práctica es un
procedimiento almacenado, pero de uso interno al DBMS, por lo cual no usa parámetros, así
como investigar más a fondo el tema de triggers para obtener un conocimiento más amplio y
captar de mejor manera la información.
BIBLIOGRAFÍA

▪ HERRATE Pedro, Triggers en Transact SQL, última actualización: 19/09/2012,


fecha de consulta, 08/12/2012, disponible en la web
en:http://www.devjoker.com/contenidos/catss/278/Triggers-en-Transact-SQL.asp
▪ Create Triggers [En línea], fecha de consulta: 08/12/2012, disponible en la web en:
http://msdn.microsoft.com/es-es/library/ms189799.aspx
▪ file:///C:/Users/86454/Downloads/libro.pdf

También podría gustarte