144 - Disparador de actualización (update trigger)


Primer problema:
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;



 

Retornar