MySQL - TRIGGERS
Links
// TRIGGERS
--TRANSACCIONES
BEGIN TRANSACTION
UPDATE Nota set Nota = Nota +1 WHERE idAlumno = 1710
COMMIT TRANSACTION --validar cambios
ROLLBACK TRANSACTION --anular cambios desde el Begin Transaction
BEGIN TRANSACTION T1
BEGIN TRANSACTION T2
DELETE FROM Nota
COMMIT TRANSACTION T2
ROLLBACK TRANSACTION T1
--TRIGGERS
-- INSERT, UPDATE, DELETE
-- Se ejecutan automáticamente procedimientos almacenados al efectuar estas acciones
-- SE ve en SQL en carpeta de la tabla, DESENCADENADORES: El trigger es lo último que se ejecuta
-- Lanzan mensajes de error
-- Se usan principalmente para 3 cosas: Checkear datos, mantener datos o tener un log
-- En el trigger se crean dos TABLAS virtuales: INSERTED y DELETED
-- No hay parámetros
-- CUANDO HAY QUE PONERLO PARA QUE SE EJECUTE
GO
CREATE TRIGGER trNoToquesNotas ON Nota FOR INSERT, DELETE, UPDATE
AS
--A quien estás cambiando?
raiserror ( 'NO TOQUES LAS NOTAS', 16, 1) --16: nivel de error, a partir de 21 solo para administrador
ROLLBACK TRANSACTION --anularia la acción siempre
GO
CREATE TRIGGER trNoToquesNotas2 ON Nota FOR UPDATE
AS
DECLARE @novavieja int
DECLARE @notanueva int
SET @novavieja = (SELECT NOTA FROM inserted)
SET @notanueva = (SELECT Nota FROM deleted)
if ( (SELECT Nota FROM inserted) <> (SELECT Nota FROM deleted) )
--if (UPDATE (nota)) --versión moderna SQL server
BEGIN
raiserror ( 'NO TOQUES LAS NOTAS', 16, 1)
rollback transaction
END
GO
create trigger trNoMeToquesLasNotas3 on NOTA for update
as
if ( UPDATE (nota))
begin
raiserror ('NO PUEDES MODIFICAR LA NOTA',16,1)
rollback transaction
END
go
--AFTER Y BEFORE (--TAMBIEN INSTEAD OF, pero no usamos mucho
create trigger trNoMeToquesLasNotas4 on NOTA AFTER update --o Before
as
if ( UPDATE (nota))
begin
raiserror ('NO PUEDES MODIFICAR LA NOTA',16,1)
rollback transaction
END
go
CREATE TRIGGER trNoToquesNotasTutoria ON Nota FOR UPDATE
AS
DECLARE @id int
DECLARE @nota int
SET @id = (SELECT idAlumno FROM inserted)
SET @nota = (SELECT Nota FROM inserted)
if ( (SELECT Nota FROM inserted) <> (SELECT Nota FROM deleted) )
BEGIN
--cambio de nota UPDATE
END
GO
--if (update(nota))
--TRIGGER EJERCICIO DE ALUMNO QUE NO TENGA MENOS DE 10 ASIGNATURAS
CREATE TRIGGER trNoMenosDe10Asignaturas ON Nota FOR DELETE, UPDATE
AS
DECLARE @numAsignaturas int
DECLARE @id int
SET @id = (SELECT idAlumno FROM deleted)
SET @numAsignaturas = (SELECT COUNT(idAsignatura) FROM Nota WHERE idAlumno = @id)
if (@numAsignaturas < 10)
BEGIN
raiserror ('LOS ALUMNOS NO PUEDEN TENER MENOS DE 10 ASIGNATURAS',16,1)
rollback transaction
END
GO
create or alter trigger trMenosDeTresAsignaturas2 on nota for update, delete
as
declare @idAlumno int -- a quien le estas haciendo esto!!
set @idAlumno=(select idAlumno from deleted)
declare @asignaturas int
set @asignaturas = (select count(*) from Nota WHERE idAlumno=@idAlumno)
if (@asignaturas < 3)
begin
raiserror ('Tiene menos de tres asignaturas', 16,1)
rollback transaction
end
GO
create or alter trigger trMenosDeTresAsignaturas on nota for update, delete
as
IF ( (select COUNT(*) from Nota where idAlumno=(select idAlumno from deleted)) < 3)
begin
raiserror ('Tiene menos de tres asignaturas', 16,1)
rollback transaction
end
GO