Triggers DML en SQL Server

Como ya habíamos visto en el artículo sobre Triggers en MySQL, un Trigger es una rutina especial que se ejecuta automáticamente cuando surgen eventos DML en nuestras tablas. Quiere decir que no podemos ejecutarlos explícitamente como a los procedimientos o funciones, si no que lo dejamos en manos del gestor de bases de datos.
Recuerda que los eventos DML surgen al usar las sentencias INSERT, UPDATE y DELETE. En SQL Server un Trigger se ejecuta por una operación completa de modificación, no por cada fila de la operación como lo hace MySQL.
Como usar Triggers en SQL Server


Como creo un Trigger en SQL Server?

Es sencillo, usaremos el comando CREATE TRIGGER con la siguiente sintaxis:CREATE TRIGGER nombre_triggerON { tabla|vista }
[ WITH ENCRYPTION ]
{ AFTER | INSTEAD OF }{ INSERT, UPDATE, DELETE }
[ NOT FOR REPLICATION ]
AS
Bloque de instrucciones

A continuación veremos la utilidad de cada parte de la definicion anterior:
WITH ENCRYPTION:
Encripta
el código del Trigger para que no pueda ser interpretado por nadie mas.AFTER:Indica que el Trigger se ejecutará después de que las operaciones DML se hayan ejecutado correctamente. Esta clausula no se aplica en las vistas.INSTEAD OF:Permite ejecutar el Trigger en vez de la operación DML,es decir, SQL Server ignora dicha operación para ejecutar al Trigger. Ten en cuenta que solo debe existir un Trigger tipo INSTEAD OF para cada operación DML.INSERT, UPDATE, DELETE:En este apartado eliges que sentencias DML estará asociadas a tu Trigger. Puedes realizar la combinación que desees. Ten en cuenta que no se permite establecer una actualización o eliminación que vaya a ser en cascada.NOT FOR REPLICATION:
Evita
que el Trigger se ejecute cuando una operación de replicación vaya a alterar nuestra tabla asociada.

Los Triggers INSTEAD OF no son lo mismo que los BEFORE de MySQL. Los primeros reemplazan una operación DML y los segundos se ejecutan antes de esta, pero no la reemplazan.Podrías explicar algún ejemplo de un Trigger AFTER?

Claro que si!, a continuación ilustraremos con sencillez un pequeño Trigger que imprima un mensaje después de que se haya ejecutado una inserción en una tabla que guarda los Pacientes de un hospital.CREATE TRIGGER dbo.paciente_AI_Trigger ON dbo.PACIENTE
AFTER INSERT
AS
PRINT "Se modificaron la siguiente cantidad de filas";

Luego que este creado el Trigger insertamos una fila en la tabla PACIENTE:INSERT INTO PACIENTE (IDPACIENTE,NOMBRE, APELLIDO,ENFERMEDAD)
VALUES (1001,"Robin","Vallegaz","Tuberculosis");

Este sería el resultado:
Resultado Trigger


Que pasaría si en el ejemplo anterior usamos INSTEAD OF?

Modifiquemos el código y veamos:CREATE TRIGGER dbo.paciente_AI_Trigger ONdbo.PACIENTE
INSTEAD OF INSERT
AS
PRINT "Se modificaron la siguiente cantidad de filas";

Ahora tratemos de insertar un paciente:INSERT INTO PACIENTE (IDPACIENTE,NOMBRE, APELLIDO,ENFERMEDAD)
VALUES (1002,"Carlos","Guerra","Polio");

Resultado:

Resultado Trigger INSTEAD OF

Aparentemente se acaba de agregar una fila, pero no es así, el Trigger se ha ejecutado y ha evitado que se agregue. Esto se comprueba realizando un SELECT al código 1002 con que supuestamente insertarmos le registro.SELECT NOMBRE
FROM PACIENTE
WHERE IDPACIENTE = 1002;

Resultados Trigger INSTEAD OF


Al consultar por la existencia del paciente vemos que este no ha sido insertado. El Trigger cumplió su cometido.Usa el procedimiento sp_helptrigger para ver que procedimientos están asociados a una tabla particular.

Como relaciono las columnas de la tabla con el Trigger?

Usaremos las tablas auxiliares inserted y deleted que guardan temporalmente los registros insertados y los que han sido eliminados. Esta conveniencia es similar a los identificadores NEW y OLD de MySQL.
Cuando sea necesario en el Trigger realizaremos consultas sobre estas dos tablas y así obtener consistencia en nuestros requerimientos o reglas de negocio. También es posible saber que columna alteraste usando la función UPDATE(nombre_columna), la cual devuelve el valor de TRUE si la columna indicada fue modificada dento del Trigger.Que utilidades tienen los Triggers?

Sus usos son variados y dependen de tus necesidades. Por lo general los Triggers se usan para Validar si los datos a insertar en un tabla tienen las características correctas, Mantener reglas de negocio, Realizar seguimientos de las modificaciones de una tabla(logs), Proteger la base de datos de alteraciones inseguras y muchas aplicaciones mas.
Suponga que tiene una base de datos que maneja el Sistema de facturación de su Tienda de Caramelos y que quiere saber en que momentos se han realizado modificaciones en la tabla FACTURA.
Auditoría de una tabla
Construiremos un Trigger para la sentencia UPDATE que guarde aquellos cambios realizados en una tabla llamada FACTURA_LOGS.CREATE TRIGGER FACTURA_UPDATE_TRIGGER ONFACTURA
AFTER UPDATE
AS
BEGIN
DECLARE @DESCVARCHAR(500) = "Se modificó el valor de ";
IF UPDATE(IDFACTURA)
SELECT @DESC =@DESC + "IDFACTURA de "+D.IDFACTURA+" a "+I.IDFACTURA+", "
FROM INSERTED AS I,DELETED AS D;
IF UPDATE(IDCLIENTE)
SELECT @DESC=@DESC + "IDCLIENTE de "+D.IDCLIENTE+" a "+I.IDCLIENTE+", "
FROM INSERTED AS I,DELETED AS D;
IF UPDATE(FECHA)
SELECT @DESC=@DESC + "FECHA de "+CAST(D.FECHA  AS VARCHAR) +" a "
+CAST(I.FECHA AS VARCHAR)+", "
FROM INSERTED AS I,DELETED AS D;
IF UPDATE(DESCUENTO)SELECT @DESC=@DESC + "DESCUENTO de "
+CAST(D.DESCUENTO AS VARCHAR)+" a "+CAST(I.DESCUENTO AS VARCHAR)+", "
FROM INSERTED AS I,DELETED AS D;
IF UPDATE(TOTAL)
SELECT @DESC=@DESC + "TOTAL de "+CAST(D.TOTAL AS VARCHAR)+" a "
+CAST(I.TOTAL AS VARCHAR)
FROM INSERTED AS I,DELETED AS D;
INSERT INTO FACTURA_LOGS
VALUES (@DESC);
END;

El código anterior es ejecutado cuando se modifique la tabla FACTURA. Con al función UPDATE() comprobamos que campos han sido alterados. Registramos los cambios de un valor anterior al valor actual consultando las tablas INSERTED y DELETED. Finalmente insertamos en nuestra tabla FACTURA_LOGS el varchar final creado como descripción.
Regla de negocio simple
En la base de datos de una Empresa petrolera existe una tabla llamada CANDIDATO. Esta entidad hace referencia a las personas que por méritos se han destacado entre varios aspirantes para ocupar una serie de vacantes que existen.
Si por alguna razón se intenta insertar un candidato con menos de 18 años, este registro debe ser remitido automáticamente a una tabla llamada CPENDIENTE. Esto con el fin de evaluar cada caso específico para el futuro.
Para ello emplearemos un Trigger que valide el atributo edad. Observa:CREATE TRIGGER candidato_insert_trigger ONCANDIDATO
AFTER INSERT
AS
BEGIN
DELETE FROM CANDIDATO
WHERE EDAD<18;
INSERT INTO CPENDIENTE
SELECT * FROM INSERTED WHERE EDAD<18;
END;

Es sencillo, solo borramos de la tabla CANDIDATO aquellos clientes con menos de 18 años y luego los insertamos en CPENDIENTE.Como elimino un TRIGGER de la base de datos?

Con la sentencia DROP TRIGGER, déjame mostrarte como eliminamos un trigger asociado a una base de datos perteneciente a una Entidad financiera.DROP TRIGGER Finanzas.balance_update_trigger;

También puedes inhabilitar el Trigger para que no sea ejecutado. Esto evita que lo borremos y poder tenerlo disponible para el futuro. Para deshabilitarlo o habilitarlo usaremos los comandos DISABLE o ENABLE en una sentencia ALTER TABLE. Veamos un ejemplo para desactivar un Trigger:ALTER TABLE empleado DISABLE TRIGGER empleado_trigger;

Con esa instrucción estamos desactivando el trigger empleado_trigger relacionado con la tabla EMPLEADO. Si deseas activarlo simplemente usas ENABLE y listo.James Revelo Urrea - Desarrollador independiente http://www.hermosaprogramacion.com

Fuente: este post proviene de Hermosa Programación, donde puedes consultar el contenido original.
¿Vulnera este post tus derechos? Pincha aquí.
Modificado:
¿Qué te ha parecido esta idea?

Esta idea proviene de:

Y estas son sus últimas ideas publicadas:

Recomendamos

Relacionado

informática funciones sql server ...

Como habíamos visto en el articulo de funciones en MySQL, una función es una rutina almacenada que recibe unos parámetros escalares de entrada, luego los procesa según el cuerpo definido de la función y por ultimo retorna en un resultado de un tipo especifico que permitirá cumplir un objetivo. A diferencia de MySQL las funciones definidas por el usuario en SQL Server permiten retornar tablas en l ...

informática bases de datos cursor ...

Un cursor es un objeto que te permite leer fila por fila los resultados que arroja una consulta. Lo que significa que ahora podremos ejecutar bloques de instrucciones que se relacionen individualmente con cada registro. A lo largo de este artículo estudiaremos los pasos necesarios para usar un cursor sobre una consulta. Veremos como usar el bucle WHILE para leer completamente la información y fina ...

informática bases de datos c# ...

Conectar nuestras aplicaciones C# a una base de datos en SQL Server es uno de los requerimientos mas importantes de funcionalidad en nuestros proyectos. Por eso hoy aprenderemos una forma de realizar esta conexión y veremos ejemplos que nos guíen a través de todo el articulo. En primera instancia verás como abrir la conexión al servidor, luego aprenderás a ejecutar comandos , también a mostrar los ...

informática bases de datos ejemplos ...

Un Trigger en MySQL es un programa almacenado(stored program), creado para ejecutarse automaticamente cuando ocurra un evento en nuestra base de datos. Dichos eventos son generados por los comandos INSERT, UPDATE y DELETE, los cuales hacen parte del DML(Data Modeling Languaje) de SQL. Esto significa que invocaremos nuestros Triggers para ejecutar un bloque de instrucciones que proteja, restrinja ...

Tecnología linux Microsoft ...

Normalmente siempre estamos informando sobre el mundo de los Smartphones, pero esta noticia que acabamos de conocer es todo un acontecimiento en la industria de la tecnología. A través del blog oficial de Microsoft la compañía anuncio que SQL Server estará disponible para Linux. SQL Server es un software para base de datos ampliamente utilizado por las empresas alrededor del mundo, sin embargo, es ...

informatica mysql xxs ...

¿Qué es el SQL injection? Una inyección de SQL, a veces abreviada como SQLi, es un tipo de vulnerabilidad en la que un atacante usa un trozo de código SQL (lenguaje de consulta estructurado) para manipular una base de datos y acceder a información potencialmente valiosa. Secuencias de comandos entre sitios (XSS) Cross Site Scripting o XSS es una vulnerabilidad en la que el usuario de una aplicació ...

informática bases de datos cursor ...

Un cursor es un objeto que apunta a las filas retornadas de una consulta. Esta característica permite manipular los datos de cada fila de forma individual. MySQL usa la palabra reservada CURSOR para declarar estos espacios de lectura. ¿Qué son los Cursores en MySQL? Recuerda que cuando consultábamos tablas con SELECT, MySQL arrojaba rápidamente los registros en pantalla de un solo tiro y nosotros ...

informática bases de datos funciones ...

Una función en MySQL es una rutina creada para tomar unos parámetros, procesarlos y retornar en un salida. Se diferencian de los procedimientos en las siguientes características: Solamente pueden tener parámetros de entrada IN y no parámetros de salida OUT o INOUT Deben retornar en un valor con algún tipo de dato definido Pueden usarse en el contexto de una sentencia SQL Solo retornan un valor in ...

Linux

Para facilitar las pruebas tanto en GNOME como en KDE desktop simultáneamente, decido instalar Kubuntu en mi VMware Server. He aquí una guía sobre cómo instalar Kubuntu en Ubuntu con VMware Server. En primer lugar, descargue e instale VMware. (la instrucción aquí ). A continuación, descargue el archivo iso de Kubuntu de http://www.kubuntu.org/download.php Inicie su VMware Server. Haga clic en  ...

Desarrollo web aocolumns base ...

Espero y este post sea de tu agrado, no olvides compartirlo en su redes sociales y sobre todo.. Gracias por seguirnos! Hoy veremos un ejemplo básico de DataTables con Server Side que nos hará mostrar grandes cantidades de datos directo desde base de datos de forma eficiente y veloz. Seguramente en más de un proyecto web habrás tenido la necesidad de mostrar datos en una tabla, podremos hacerlo co ...