146 - Disparador (Instead Off y after) |
Un club almacena los datos de sus socios en una tabla denominada "socios", los distintos cursos que dictan en "cursos" y las inscripciones de los distintos socios en los distintos cursos en "inscriptos". 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('cursos') is not null drop table cursos; 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 cursos( numero tinyint identity, deporte char(20), cantidadmaxima tinyint, constraint PK_cursos primary key(numero) ); create table inscriptos( documento char(8) not null, numerocurso tinyint, fecha datetime, constraint PK_inscriptos primary key(documento,numerocurso), constraint FK_inscriptos_documento foreign key (documento) references socios(documento), constraint FK_inscriptos_curso foreign key (numerocurso) references cursos(numero) ); Los cursos tiene un número que los identifica, y según el deporte, hay un límite de inscriptos (por ejemplo, en tenis, no pueden inscribirse más de 4 socios; en natación, solamente se aceptan 6 alumnos como máximo). Cuando un curso está completo, es decir, hay tantos inscriptos como valor tiene el campo "cantidadmaxima"), el socio queda inscripto en forma condicional. El club guarda esa información en una tabla denominada "condicionales" que luego analiza, porque si se inscriben muchos para un deporte determinado, se abrirá otro curso. 2- Elimine la tabla "condicionales" si existe: if object_id('condicionales') is not null drop table condicionales; 3- Cree la tabla, con la siguiente estructura: create table condicionales( documento char(8) not null, codigocurso tinyint not null, fecha datetime ); 4- Ingrese algunos registros en las tablas "socios", "cursos" e "inscriptos": 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 socios values('26666666','Patricia Palacios','Paru 587'); insert into cursos values('tenis',4); insert into cursos values('natacion',6); insert into cursos values('basquet',20); insert into cursos values('futbol',20); insert into inscriptos values('22222222',1,getdate()); insert into inscriptos values('22222222',2,getdate()); insert into inscriptos values('23333333',1,getdate()); insert into inscriptos values('23333333',3,getdate()); insert into inscriptos values('24444444',1,getdate()); insert into inscriptos values('24444444',4,getdate()); insert into inscriptos values('25555555',1,getdate()); 5- Cree un trigger "instead of" para el evento de inserción para que, al intentar ingresar un registro en "inscriptos" controle que el curso no esté completo (tantos inscriptos a tal curso como su "cantidadmaxima"); si lo estuviese, debe ingresarse la inscripción en la tabla "condicionales" y mostrar un mensaje indicando tal situación. Si la "cantidadmaxima" no se alcanzó, se ingresa la inscripción en "inscriptos". 6- Inscriba un socio en un curso que no esté completo. Verifique que el trigger realizó la acción esperada consultando las tablas: select *from inscriptos; select *from condicionales; 7- Inscriba un socio en un curso que esté completo. Verifique que el trigger realizó la acción esperada consultando las tablas: select *from inscriptos; select *from condicionales;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('cursos') is not null drop table cursos; create table socios( documento char(8) not null, nombre varchar(30), domicilio varchar(30), constraint PK_socios primary key(documento) ); create table cursos( numero tinyint identity, deporte char(20), cantidadmaxima tinyint, constraint PK_cursos primary key(numero) ); create table inscriptos( documento char(8) not null, numerocurso tinyint, fecha datetime, constraint PK_inscriptos primary key(documento,numerocurso), constraint FK_inscriptos_documento foreign key (documento) references socios(documento), constraint FK_inscriptos_curso foreign key (numerocurso) references cursos(numero) ); if object_id('condicionales') is not null drop table condicionales; create table condicionales( documento char(8) not null, codigocurso tinyint not null, fecha datetime ); 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 socios values('26666666','Patricia Palacios','Paru 587'); insert into cursos values('tenis',4); insert into cursos values('natacion',6); insert into cursos values('basquet',20); insert into cursos values('futbol',20); insert into inscriptos values('22222222',1,getdate()); insert into inscriptos values('22222222',2,getdate()); insert into inscriptos values('23333333',1,getdate()); insert into inscriptos values('23333333',3,getdate()); insert into inscriptos values('24444444',1,getdate()); insert into inscriptos values('24444444',4,getdate()); insert into inscriptos values('25555555',1,getdate()); create trigger dis_inscriptos_insertar on inscriptos instead of insert as begin declare @maximo tinyint select @maximo=cantidadmaxima from cursos as c join inserted as i on c.numero=i.numerocurso if (@maximo=(select count(*) from inscriptos as i join cursos as c on i.numerocurso=c.numero join inserted as ins on i.numerocurso=ins.numerocurso)) -- esta completo begin insert into condicionales select documento,numerocurso,fecha from inserted select 'Inscripción condicional.' end else -- no esta completo begin insert into inscriptos select documento,numerocurso,fecha from inserted select 'Inscripción realizada.' end end; insert into inscriptos values('26666666',2,getdate()); select *from inscriptos; select *from condicionales; insert into inscriptos values('26666666',1,getdate()); select *from inscriptos; select *from condicionales;