144 - Disparador de actualización (update trigger) |
Un club almacena los datos de sus socios en una tabla denominada "socios", las inscripciones en "inscriptos" y en otra tabla "morosos" guarda los documentos de los socios que deben matrículas. 1- Elimine las tablas si existen: 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; 2- Cree las tablas, con las siguientes estructuras: 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 ); 3- Ingrese algunos registros en las 3 tablas: 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'); 4- Cree un disparador para la tabla "inscriptos" que se active ante una sentencia "update" y no permita actualizar más de un registro. 5- Cree otro disparador para la tabla "inscriptos" que se active ante una sentencia "update". Si se actualiza el pago de la matrícula a 's', el socio debe eliminarse de la tabla "morosos"; no debe permitir modificar a 'n' una matrícula paga. 6- Actualice cualquier campo (diferente de "matricula") de un registro de la tabla "inscriptos". Ambos disparadores se activaron permitiendo la transacción. 7- Actualice cualquier campo (diferente de "matricula") de varios registros de la tabla "inscriptos". El disparador "dis_inscriptos_actualizar1" se activa y no permite la transacción. El disparador "dis_inscriptos_actualizar_matricula" no llega a activarse. 8- Actualice el campo "matricula" a 's' de un inscripto que deba la matrícula. Ambos disparadores se activaron y permitieron la actualización. 9- Verifique que el campo se actualizó y que el socio ya no está en "morosos": select *from inscriptos; select *from morosos; 10-Actualice el campo "matricula" a 'n' de un inscripto que tenga la matrícula paga. Ambos disparadores se activaron; "dis_inscriptos_actualizar_matricula" deshace la transacción.Ver solución
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 ); 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'); create trigger DIS_inscriptos_actualizar1 on inscriptos for update as if (select count(*) from deleted) > 1 begin raiserror('No puede actualizar más de un registro',16,1) rollback transaction end; create trigger DIS_inscriptos_actualizar_matricula on inscriptos for update as if update(matricula) if (select matricula from inserted)='n' and (select matricula from deleted)='s' begin raiserror('No puede colocar impaga una cuota paga.', 16, 1) rollback transaction end else if (select matricula from inserted)='s' and (select matricula from deleted)='n' delete morosos from morosos join deleted on deleted.documento=morosos.documento where morosos.documento=deleted.documento; update inscriptos set deporte='basquet' where numero=1; update inscriptos set deporte='basquet' where numero between 3 and 4; update inscriptos set matricula='s' where numero=2; select *from inscriptos; select *from morosos; update inscriptos set matricula='n' where numero=2;