Un trigger es una herramienta poderosa en el mundo de las bases de datos. Básicamente, se trata de un procedimiento almacenado que está vinculado a una tabla específica y se activa automáticamente cuando se realizan ciertas acciones con los datos de esa tabla, como INSERT, DELETE o UPDATE. La utilidad de los triggers es infinita: desde enviar notificaciones, realizar validaciones adicionales, retroceder transacciones si no cumplen con ciertos criterios, o enviar correos electrónicos a los administradores.
Los triggers permiten automatizar procesos y garantizar la integridad y coherencia de los datos en situaciones específicas.
¿Cómo crear un trigger para un INSERT?
Crear un trigger es sencillo y requiere definirlo con claridad para una tabla específica. A continuación se muestra un ejemplo de cómo crear un trigger para interceptar acciones de INSERT en una tabla ficticia llamada Usuario Target:
CREATETRIGGER NombreDelTrigger
ON UsuarioTarget
AFTERINSERTASBEGIN-- Verifica que al menos un registro fue insertadoIF(SELECTCOUNT(*)FROM INSERTED)=0RETURN;-- Operaciones a realizar tras el INSERTPRINT'Se realizó el insert.';END;
Este sencillo ejemplo imprime un mensaje cada vez que se realiza un INSERT exitoso en la tabla Usuario Target.
¿Cómo funciona un trigger para UPDATE?
Un trigger para UPDATE se asemeja mucho al de INSERT, pero tiene en cuenta que una operación de UPDATE es, en muchas base de datos, equivalente a un DELETE seguido por un INSERT. Es importante validar esta lógica cuando se escriben triggers para UPDATE. El siguiente es un ejemplo ajustado de cómo se configura:
CREATETRIGGER TriggerDeActualización
ON UsuarioTarget
AFTERUPDATEASBEGIN-- Asegúrate de seleccionar lo adecuado desde la tabla INSERTEDIF(SELECTCOUNT(*)FROM INSERTED)=0RETURN;-- El código implica que la operación fue un UPDATEPRINT'Se realizó el update.';END;
En este caso, el trigger se ejecutará luego de una operación UPDATE, validando y notificando de manera similar al trigger INSERT.
¿Cómo crear un trigger para DELETE?
Esta vez, se te ofrece como tarea crear un trigger para DELETE. Sigue el mismo esquema, pero con la modificación para detectar la acción AFTER DELETE. Aquí te dejo una estructura base para comenzar:
CREATETRIGGER TriggerEliminación
ON UsuarioTarget
AFTERDELETEASBEGIN-- Validaciones referentes al DELETEPRINT'Se realizó la eliminación.';END;
Explora las múltiples formas en que puedes personalizar las operaciones dentro del trigger y experimenta con notificaciones o acciones adicionales. La capacidad para extender los triggers a múltiples funcionalidades solo está limitada por tus necesidades y creatividad.
Recuerda que el uso apropiado de triggers no solo mejora la eficiencia de las bases de datos, sino que también ayuda a mantener el control sobre las operaciones y asegura que todas las transacciones se completen de acuerdo con las reglas definidas.
Continúa explorando y practicando, y descubrirás lo poderoso que puede ser este mecanismo en tus futuros proyectos de base de datos. ¡Sigue adelante!
CREATEORALTERTRIGGER t_delete
ONUsuarioTargetAFTERDELETEASBEGINIF(ROWCOUNT_BIG()=0)RETURN; select Codigo,Nombre,Puntosfrom deleted
Print'Se realizó un delete'ENDGO
Exelente
Un disparador o trigger es una funcionalidad que la base de datos ejecuta de forma automática cuando se realiza una operación de tipo Insert, Update o Delete en una tabla o vista, o cuando se ejecuta una consulta SQL sobre una tabla o vista.
Se crean para conservar la integridad referencial y la coherencia entre los datos entre distintas tablas; para registrar los cambios que se efectúan sobre las tablas y la identidad de quien los realizó; para realizar cualquier acción cuando una tabla es modificada; etc.
Si se intenta modificar (agregar, actualizar o eliminar) datos de una tabla asociada a un disparador, el disparador se ejecuta (se dispara) en forma automática.
La diferencia con los procedimientos almacenados del sistema es que los triggers:
• no pueden ser invocados directamente; al intentar modificar los datos de una tabla asociada a un disparador, el disparador se ejecuta automáticamente.
• no reciben y retornan parámetros.
• son apropiados para mantener la integridad de los datos, no para obtener resultados de consultas.
Sintaxis general para crear un disparador:
create or replace trigger NOMBREDISPARADOR
MOMENTO-- before, after o instead of
EVENTO-- insert, update o delete
of CAMPOS-- solo para update
on NOMBRETABLA
NIVEL--puede ser a nivel de sentencia (statement) o de fila (for each row)
when CONDICION--opcional
begin
CUERPO DEL DISPARADOR--sentencias
end NOMBREDISPARADOR;
Los triggers se crean con la instrucción "create trigger" seguido del nombre del disparador. Si se agrega "or replace" al momento de crearlo y ya existe un trigger con el mismo nombre, tal disparador será borrado y vuelto a crear.
"MOMENTO" indica cuando se disparará el trigger en relación al evento, puede ser BEFORE (antes), AFTER (después) o INSTEAD OF (en lugar de). "before" significa que el disparador se activará antes que se ejecute la operación (insert, update o delete) sobre la tabla, que causó el disparo del mismo. "after" significa que el trigger se activará después que se ejecute la operación que causó el disparo. "instead of" sólo puede definirse sobre vistas, anula la sentencia disparadora, se ejecuta en lugar de tal sentencia (ni antes ni después).
"EVENTO" especifica la operación (acción, tipo de modificación) que causa que el trigger se dispare (se active), puede ser "insert", "update" o "delete"; DEBE colocarse al menos una acción, puede ser más de una, en tal caso se separan con "or". Si "update" lleva una lista de atributos, el trigger sólo se ejecuta si se actualiza algún atributo de la lista.
"on NOMBRETABLA" indica la tabla (o vista) asociada al disparador;
"NIVEL" puede ser a nivel de sentencia o de fila. "for each row" indica que el trigger es a nivel de fila, es decir, se activa una vez por cada registro afectado por la operación sobre la tabla, cuando una sola operación afecta a varios registros. Los triggers a nivel de sentencia, se activan una sola vez (antes o después de ejecutar la operación sobre la tabla). Si no se especifica, o se especifica "statement", es a nivel de sentencia.
"CUERPO DEL DISPARADOR" son las acciones que se ejecutan al dispararse el trigger, las condiciones que determinan cuando un intento de inserción, actualización o borrado provoca las acciones que el trigger realizará. El bloque se delimita con "begin... end".
Entonces, un disparador es un bloque de código asociado a una tabla que se dispara automáticamente antes o después de una sentencia "insert", "update" o "delete" sobre la tabla.
Se crean con la instrucción "create trigger" especificando el momento en que se disparará, qué evento lo desencadenará (inserción, actualización o borrado), sobre qué tabla (o vista) y las instrucciones que se ejecutarán.
Los disparadores pueden clasificarse según tres parámetros:
• el momento en que se dispara: si se ejecutan antes (before) o después (after) de la sentencia.
• el evento que los dispara: insert, update o delete, según se ejecute una de estas sentencias sobre la tabla.
• nivel: dependiendo si se ejecuta para cada fila afectada en la sentencia (por cada fila) o bien una única vez por sentencia independientemente de la filas afectadas (nivel de sentencia).
Consideraciones generales:
• Las siguientes instrucciones no están permitidas en un desencadenador: create database, alter database, drop database, load database, restore database, load log, reconfigure, restore log, disk init, disk resize.
• Se pueden crear varios triggers para cada evento, es decir, para cada tipo de modificación (inserción, actualización o borrado) para una misma tabla. Por ejemplo, se puede crear un "insert trigger" para una tabla que ya tiene otro "insert trigger".
A continuación veremos la creación de disparadores para los distintos sucesos (inserción, borrado, actualización) y todas las cláusulas adicionales.
Yo hice una tabla Log para que en caso de que ocurra cualquiera de los triggers que se pueda llevar un registro en caso de que algo pase se pueda reversar :)
<code>/*
--DROP TABLE UsuarioTarget_log
CREATE TABLE UsuarioTarget_log
(
[id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
Codigo INT,
Nombre VARCHAR(100),
Puntos INT,
DateChange DATETIME,
ActionChange VARCHAR(100),
UserChange VARCHAR(100)
)
--Select * From UsuarioTarget_log
*/CREATEORALTERTRIGGER t_delete
ONUsuarioTargetAFTERDELETEASBEGINIF(ROWCOUNT_BIG()=0)RETURN;Insert into UsuarioTarget_log select Codigo,Nombre,Puntos,GETDATE()as'DateChange','DELETE AFTER'as'ActionChange',SUSER_NAME()as'UserChange'from deleted
Print'Se realizó un delete'ENDGO
He creado un Trigger que, al hacer un DELETE a mi tabla, me inserta automáticamente un registro nuevo en el que, tanto en la columna de **++Código ++**como en la de ++Puntos++ se genera un integer aleatorio entre en 1 y el 99, mientras que en el ++Nombre++ se genera un Varchar con el string "Aleatorio" y un número aleatorio, valga la redundancia.
¡Espero haberme explicado bien!
CREATETRIGGER t_delete
ON[UsuarioTarget]AFTERDELETEASBEGININSERTINTO[UsuarioTarget]VALUES(FLOOR(RAND()*(99-1)+1),CONCAT('Aleatorio',CAST(FLOOR(RAND()*(99-1)+1)ASVARCHAR)),FLOOR(RAND()*(99-1)+1))Print'¡Se ha borrado un registro y se ha creado otro aleatorio!'END
por cada insert, delete o update se inserte un registro en una tabla log con el detalle de la operación, sería un buen uso de este? en cuanto a rendimiento es recomendable usarlos para esto? De antemano, gracias por tu respuesta.
El uso de una tabla log para controlar una bitacora para auditoria por ejemplo pues ahi depende de tus necesidades. En todo caso tambien puedes pensar usar tablas versionadas.
Dentro del archivo adjunto de esta clase, al final del mismo; menciona "-- Podriamos tener un trigger que cuando se ingrese una venta, nos recalcule los valores de la tabla de inventario"
¿A que base de datos hace referencia? para poder realizar la actividad.
En el adjunto no agregué el query de ejemplo, pero con las dos bases de datos de ejemplo AdventuraWorks o WideWorldImporters podrías hacer el laboratorio. El ejemplo seria, teniendo las tablas de ventas e inventario, actualizar los articulos disponibles mediante un trigger.
Excelente, gracias por la retro
Alguno me podría ayudar por favor con una explicación sencilla de esto:
Logon triggers fire in response to the LOGON event that's raised when a user's session is being established. You can create triggers directly from Transact-SQL statements or from methods of assemblies that are created in the Microsoft .NET Framework common language runtime (CLR) and uploaded to an instance of SQL Server. SQL Server lets you create multiple triggers for any specific statement.
El error que estás recibiendo indica que estás intentando crear un trigger de inicio de sesión en Microsoft SQL Server. Los triggers de inicio de sesión se activan en respuesta al evento LOGON que se genera cuando se establece una sesión de usuario. Puedes crear triggers directamente desde declaraciones Transact-SQL o desde métodos de ensamblados creados en el runtime de lenguaje común de Microsoft .NET Framework y cargados en una instancia de SQL Server.
El SQL Server te permite crear varios triggers para cualquier declaración específica.
Saludos!
pd. Si un profe platzi puede validar lo que indico también seria de utilidad para otros compañeros
Gracias Francisco!
Los triggers son unas herramientas poderosas, pero hay que tener mucho cuidado, por que puede ser un cuello de botella
CREATEORALTERTRIGGER t_delete
ONUsuarioTargetAFTERDELETEASBEGINIF(ROWCOUNT_BIG()=0)RETURN; select Codigo,Nombre,Puntosfrom deleted
Print'Se realizó un delete'ENDGO
Trigger es un a especie de SP que esta relacionado con una tabla que se ejecuta cuando se produce un insert, update o delete en la tabla.
Sirve para ejecutar varias acciones como notificaciones, validadores, otros.
create trigger t_delete
on dbo.UsuarioSource
after delete
as
begin
if (ROWCOUNT_BIG()= 0)
RETURN;
En esta clase intenté usar el Procedimiento Almacenado MergeUsuarioTarget .
exec MergeUsuarioTarget6,'jj',2
Cuando el procedimiento terminaba ejecutando un INSERT el resultado del mensaje es
(1 row affected)
Se realizó un insert
(0 rows affected)
Se realizó un update
(1 row affected)
Y cuando el resultado del MergeUsuarioTarget era un UPDATE el mensaje era
(0 rows affected)
Se realizó un insert
(1 row affected)
Se realizó un update
(1 row affected)
Pregunta: Por qué el procedimiento almacenado dispara ambos triggers?
Habría que revisar el trigger, pero MERGE puede ejecutar delete, update e insert en una misma operacion, por lo que si en el trigger tienes que capture insert y update va a ejecutar ambas si en el merge se utilizaron
Un trigger en SQL se implementa mediante la sentencia CREATE TRIGGER. Su estructura básica es la siguiente:
CREATETRIGGER nombre_trigger
AFTER|BEFORE INSERT|UPDATE|DELETEON nombre_tabla
FOR EACH ROWBEGIN-- Lógica a ejecutarEND;
nombre_trigger: El nombre del trigger.
AFTER|BEFORE: Indica si se ejecuta antes o después de la acción.
INSERT|UPDATE|DELETE: Tipo de acción que activa el trigger.
nombre_tabla: Tabla a la que está asociado el trigger.
FOR EACH ROW: Especifica que se ejecutará por cada fila afectada.
BEGIN...END: Contiene la lógica del trigger.
Recuerda que puedes realizar validaciones y enviar notificaciones dentro del bloque de lógica.
Usar triggers es útil cuando necesitas automatizar acciones específicas en respuesta a cambios en tus datos, como validaciones, auditorías o notificaciones. Son ideales para asegurar la integridad de los datos o para realizar acciones desencadenadas por operaciones como INSERT, UPDATE o DELETE.
Sin embargo, no debes usar triggers si la lógica de negocio es compleja o si las operaciones pueden causar un rendimiento lento, ya que pueden complicar la depuración y el mantenimiento del código. En estos casos, es mejor manejar la lógica en la aplicación o mediante procedimientos almacenados.
Un trigger es un procedimiento almacenado que se ejecuta automáticamente en respuesta a ciertas acciones realizadas en una tabla de base de datos, como insert, update o delete. Permite, por ejemplo, validar datos, enviar notificaciones o realizar un rollback si es necesario. Los triggers son útiles para automatizar tareas y mantener la integridad de los datos sin intervención manual. En la clase aprendimos a crear triggers para diferentes acciones, lo que mejora la gestión de la base de datos.
CREATETRIGGER t_delete
ON usuario_target
after DELETEASBEGINIF(rowcount_big()=0)RETURN;SELECT codigo, nombre, punto
FROM inserted
PRINT'se hizo el delete'ENDGO
CREATE TRIGGER t_DELETE
ON UsuarioTarget
AFTER DELETE
AS
BEGIN
IF(ROWCOUNT_BIG() = 0)
RETURN;
SELECTCodigo,Nombre,PuntosFROMINSERTEDPrint'Se realizo el DELETE'END
CREATE OR ALTER TRIGGER T_DELETE
ON UsuarioTarget
AFTER DELETE
AS
BEGIN
IF (ROWCOUNT_BIG() = 0)
RETURN;
select Codigo, Nombre, Puntos from deleted
Print 'Se realizó un DELETE'
END
Reto realizado:
--RETO:Hacer el Trigger del DeleteCREATETRIGGER t_delete
ONUsuarioTargetAFTERDELETEASBEGINIF(ROWCOUNT_BIG()=0)RETURN;SELECTCodigo,Nombre,PuntosFROMINSERTEDPRINT'Se realizó el delete'ENDDELETEFROMUsuarioTargetWHERECodigo=7;
CREATEORALTERTRIGGER t_Delete
ONUsuarioTargetAFTERDELETEASBEGINIF(ROWCOUNT_BIG()=0)RETURN; select Codigo,Nombre,Puntosfrom inserted
Print'Se realizó un delete'ENDGO
Creo que tienes un error. Estás referenciando la tabla "inserted" en la operación de delete así que aunque el query te va a devolver el mensaje no te va a mostrar el registro que se borró. El FROM debería ser sobre "DELETED" 😅