142 - Disparador de inserción (insert trigger)


Primer problema:
Una empresa almacena los datos de sus empleados en una tabla denominada "empleados" y en otra tabla 
llamada "secciones", el código de la sección y el sueldo máximo de cada una de ellas.
1- Elimine las tablas si existen:
 if object_id('empleados') is not null
  drop table empleados;
 if object_id('secciones') is not null
  drop table secciones;

2- Cree las tablas, con las siguientes estructuras:
 create table secciones(
  codigo int identity,
  nombre varchar(30),
  sueldomaximo decimal(8,2), 
  constraint PK_secciones primary key(codigo)
 );

 create table empleados(
  documento char(8) not null,
  nombre varchar(30) not null,
  domicilio varchar(30),
  codigoseccion int not null,
  sueldo decimal(8,2),
  constraint PK_empleados primary key(documento),
  constraint FK_empelados_seccion
   foreign key (codigoseccion) references secciones(codigo)
 );

3- Ingrese algunos registros en ambas tablas:
 insert into secciones values('Administracion',1500);
 insert into secciones values('Sistemas',2000);
 insert into secciones values('Secretaria',1000);

 insert into empleados values('22222222','Ana Acosta','Avellaneda 88',1,1100);
 insert into empleados values('23333333','Bernardo Bustos','Bulnes 345',1,1200);
 insert into empleados values('24444444','Carlos Caseres','Colon 674',2,1800);
 insert into empleados values('25555555','Diana Duarte','Colon 873',3,1000);

4- Cree un disparador para que se ejecute cada vez que una instrucción "insert" ingrese datos en 
"empleados"; el mismo debe verificar que el sueldo del empleado no sea mayor al sueldo máximo 
establecido para la sección, si lo es, debe mostrar un mensaje indicando tal situación y deshacer la 
transacción.

5- Ingrese un nuevo registro en "empleados" cuyo sueldo sea menor o igual al establecido para la 
sección.

6- Verifique que el disparador se ejecutó consultando la tabla "empleados":
 select *from empleados;

7- Intente ingresar un nuevo registro en "empleados" cuyo sueldo sea mayor al establecido para la 
sección.
El disparador se ejecutó mostrando un mensaje y la transacción se deshizo.

8- Verifique que el registro no se agregó en "empleados":
 select *from empleados;

9- Intente ingresar un empleado con código de sección inexistente.
Aparece un mensaje de error porque se viola la restricción "foreign key"; el trigger no llegó a 
ejecutarse.
Ver solución

 if object_id('empleados') is not null
  drop table empleados;
 if object_id('secciones') is not null
  drop table secciones;

 create table secciones(
  codigo int identity,
  nombre varchar(30),
  sueldomaximo decimal(8,2), 
  constraint PK_secciones primary key(codigo)
 );

 create table empleados(
  documento char(8) not null,
  nombre varchar(30) not null,
  domicilio varchar(30),
  codigoseccion int not null,
  sueldo decimal(8,2),
  constraint PK_empleados primary key(documento),
  constraint FK_empelados_seccion
   foreign key (codigoseccion) references secciones(codigo)
 );

 insert into secciones values('Administracion',1500);
 insert into secciones values('Sistemas',2000);
 insert into secciones values('Secretaria',1000);

 insert into empleados values('22222222','Ana Acosta','Avellaneda 88',1,1100);
 insert into empleados values('23333333','Bernardo Bustos','Bulnes 345',1,1200);
 insert into empleados values('24444444','Carlos Caseres','Colon 674',2,1800);
 insert into empleados values('25555555','Diana Duarte','Colon 873',3,1000);

 create trigger dis_empleados_insertar
  on empleados
  for insert
 as
  declare @maximo decimal(8,2)
  set @maximo=(select sueldomaximo from secciones
              join inserted
              on inserted.codigoseccion=secciones.codigo)
  if (@maximo<(select sueldo from inserted))
  begin
    declare @mensaje varchar(40)
    set @mensaje='El sueldo debe ser menor a '+cast(@maximo as char(8))
    raiserror(@mensaje, 16, 1)
    rollback transaction
  end;

 insert into empleados values('26666666','Federico Fuentes','Francia 938',2,1000);

 select *from empleados;

 insert into empleados values('27777777','Gaston Garcia','Guemes 366',3,1200);

 select *from empleados;

 insert into empleados values('27777777','Gaston Garcia','Guemes 366',9,1200);



 

Segundo problema:
Un club de barrio almacena los datos de sus socios en una tabla llamada "socios", los datos de las 
inscripciones en una tabla denominada "inscriptos" y en una tabla "morosos" almacena el documento de 
los socios inscriptos que deben matrícula.
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(
  documento char(8) not null,
  deporte varchar(30) not null,
  matricula char(1),
  constraint CK_inscriptos check (matricula in ('s','n')),
  constraint PK_inscriptos primary key (documento,deporte),
  constraint FK_inscriptos_documento foreign key(documento)
   references socios (documento)
 );

 create table morosos(
  documento char(8) not null
 );

3- Ingrese algunos registros en las tres tablas:
 insert into socios values ('22222222','Ana Acosta','Avellaneda 800');
 insert into socios values ('23333333','Bernardo Bustos','Bulnes 234');
 insert into socios values ('24444444','Carlos Caseros','Colon 321');
 insert into socios values ('25555555','Mariana Morales','Maipu 483');

 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','tenis','s');
 insert into inscriptos values ('24444444','futbol','s');

 insert into morosos values ('22222222');
 insert into morosos values ('23333333');

4- Cree un disparador de inserción que no permita ingresar inscripciones si el socio es moroso, es 
decir, si está en la tabla "morosos".

5- Realice la inscripción de un socio que no deba matrículas.
El disparador se ejecutó.

6- Intente inscribir a un socio moroso.
El trigger se disparó, mostró un mensaje y no permitió la inserción.

7- Cree otro "insert trigger" para "inscriptos" que ingrese el socio en la tabla "morosos" si no 
paga la matrícula (si se ingresa 'n' para el campo "matricula"). Recuerde que podemos crear varios 
triggers para un mismo evento sobre una misma tabla.

8- Realice la inscripción de un socio que no deba matrículas con el valor 's' para "matricula".
El disparador "dis_inscriptos_insertar" se ejecuta y permite la transacción; el disparador 
"dis_inscriptos_insertar2" se ejecuta y permite la transacción.

9- Realice la inscripción de un socio que no deba matrículas con el valor 'n' para "matricula".
El disparador "dis_inscriptos_insertar" se ejecuta y permite la transacción; el disparador 
"dis_inscriptos_insertar2" se ejecuta y permite la transacción.

10- Verifique que el disparador "dis_inscriptos_insertar2" se ejecutó consultando la tabla 
"morosos":
 select *from morosos;

11- Realice la inscripción de un socio que deba matrículas con el valor 's' para "matricula".
El disparador "dis_inscriptos_insertar" se ejecuta y no permite la transacción; el disparador 
"dis_inscriptos_insertar2" no llega a ejecutarse.

12- Realice la inscripción de un socio que deba matrículas con el valor 'n' para "matricula".
El disparador "dis_inscriptos_insertar" se ejecuta y no permite la transacción; el disparador 
"dis_inscriptos_insertar2" no llega a ejecutarse.

13- Creamos un disparador sobre la tabla "socios" para que no permita ingresar nuevos socios. El 
mismo debe mostrar un mensaje al dispararse y deshacer la transacción.

14- Intente ingresar un nuevo socio.
El trigger se dispara, muestra el mensaje y deshace la transacción.

15- Actualizar el domicilio de un socio existente.
El trigger no se dispara porque está definido para el evento "insert".

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(
  documento char(8) not null,
  deporte varchar(30) not null,
  matricula char(1),
  constraint CK_inscriptos check (matricula in ('s','n')),
  constraint PK_inscriptos primary key (documento,deporte),
  constraint FK_inscriptos_documento foreign key(documento)
   references socios (documento)
 );

 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 234');
 insert into socios values ('24444444','Carlos Caseros','Colon 321');
 insert into socios values ('25555555','Mariana Morales','Maipu 483');

 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','tenis','s');
 insert into inscriptos values ('24444444','futbol','s');

 insert into morosos values ('22222222');
 insert into morosos values ('23333333');

 create trigger dis_incriptos_insertar
  on inscriptos
  for insert
  as
   declare @doc char(8)
   select @doc= documento from inserted
   if exists (select *from morosos where documento=@doc)
   begin
    raiserror('No puede inscribir al socio porque es moroso', 16, 1)
    rollback transaction
   end;

 insert into inscriptos values ('25555555','tenis','s');

 insert into inscriptos values ('23333333','futbol','s');

 create trigger dis_incriptos_insertar2
  on inscriptos
  for insert
  as
   if (select matricula from inserted)='n'
    insert into morosos select documento from inserted;

 insert into inscriptos values ('25555555','natacion','s');

 insert into inscriptos values ('25555555','basquet','n');

 select *from morosos;

 insert into inscriptos values ('22222222','basquet','s');

 insert into inscriptos values ('22222222','basquet','n');

 create trigger dis_socios
  on socios
  for insert
  as
   raiserror('No puede ingresar nuevos socios', 16, 1)
   rollback transaction;

 insert into socios values('30000000','Ricardo Rojas','Rivadavia 265');

 update socios set domicilio='Rivadavia 135' where documento='22222222';

Retornar