Listado completo de tutoriales
145 - Disparadores (varios eventos) |
Hemos aprendido a crear disparadores para diferentes eventos (insert, update y delete).
Dijimos que un disparador puede definirse para más de una acción; en tal caso, deben separarse con comas.
Creamos un trigger para evitar que se inscriban socios que deben matrículas y no permitir que se eliminen las inscripciones de socios deudores. El trigger se define para ambos eventos en la misma sentencia de creación.
create trigger dis_inscriptos_insert_delete
on inscriptos
for insert,delete
as
if exists (select *from inserted join morosos
on morosos.documento=inserted.documento)
begin
raiserror('El socio es moroso, no puede inscribirse en otro curso', 16, 1)
rollback transaction
end
else
if exists (select *from deleted join morosos
on morosos.documento=deleted.documento)
begin
raiserror('El socio debe matriculas, no puede borrarse su inscripcion', 16, 1)
rollback transaction
end
else
if (select matricula from inserted)='n'
insert into morosos select documento from inserted;
El trigger controla:
- si se intenta ingresar una inscripción de un socio moroso, se deshace la transacción;
- si se intenta eliminar una inscripción de un socio que está en "morosos", se deshace la transacción;
- si se ingresa una nueva inscripción y no se paga la matrícula, dicho socio se ingresa a la tabla "morosos".
Ingresemos el siguiente lote de comandos en el SQL Server Management Studio:
if object_id('inscriptos') is not null
drop table inscriptos;
if object_id('socios') is not null
drop table socios;
if object_id('morosos') is not null
drop table morosos;
create table socios(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
constraint PK_socios primary key(documento)
);
create table inscriptos(
numero int identity,
documento char(8) not null,
deporte varchar(20),
matricula char(1),
constraint FK_inscriptos_documento
foreign key (documento)
references socios(documento),
constraint CK_inscriptos_matricula check (matricula in ('s','n')),
constraint PK_inscriptos primary key(documento,deporte)
);
create table morosos(
documento char(8) not null
);
go
insert into socios values('22222222','Ana Acosta','Avellaneda 800');
insert into socios values('23333333','Bernardo Bustos','Bulnes 345');
insert into socios values('24444444','Carlos Caseros','Colon 382');
insert into socios values('25555555','Mariana Morales','Maipu 234');
insert into inscriptos values('22222222','tenis','s');
insert into inscriptos values('22222222','natacion','n');
insert into inscriptos values('23333333','tenis','n');
insert into inscriptos values('24444444','futbol','s');
insert into inscriptos values('24444444','natacion','s');
insert into morosos values('22222222');
insert into morosos values('23333333');
go
-- Creamos un trigger para evitar que se inscriban socios que deben matrículas y
-- no permitir que se eliminen las inscripciones de socios deudores.
-- El trigger se define para ambos eventos en la misma sentencia de creación.
create trigger dis_inscriptos_insert_delete
on inscriptos
for insert,delete
as
if exists (select *from inserted join morosos
on morosos.documento=inserted.documento)
begin
raiserror('El socio es moroso, no puede inscribirse en otro curso', 16, 1)
rollback transaction
end
else
if exists (select *from deleted join morosos
on morosos.documento=deleted.documento)
begin
raiserror('El socio debe matriculas, no puede borrarse su inscripcion', 16, 1)
rollback transaction
end
else
if (select matricula from inserted)='n'
insert into morosos select documento from inserted;
go
-- Ingresamos una inscripción de un socio no deudor con matrícula paga:
insert into inscriptos values('25555555','tenis','s');
-- El disparador se activa ante el "insert" y permite la transacción.
-- Ingresamos una inscripción de un socio no deudor con matrícula 'n':
insert into inscriptos values('25555555','natacion','n');
-- El disparador se activa ante el "insert", permite la transacción y agrega
-- al socio en la tabla "morosos".
--Verifiquémoslo consultando las tablas correspondientes:
select * from inscriptos;
select * from morosos;
-- Ingresamos una inscripción de un socio deudor:
insert into inscriptos values('25555555','basquet','s');
-- El disparador se activa ante el "insert" y deshace la transacción porque
-- encuentra su documento en la tabla "morosos".
-- Eliminamos una inscripción de un socio no deudor:
delete inscriptos where numero=4;
-- El disparador se activa ante la sentencia "delete" y permite la transacción.
-- Verificamos que la inscripción nº 4 fue eliminada de "inscriptos":
select * from inscriptos;
-- Intentamos eliminar una inscripción de un socio deudor:
delete inscriptos where numero=6;
-- El disparador se activa ante el "delete" y deshace la transacción porque
-- encuentra su documento en "morosos".