143 - Disparador de borrado (delete trigger)


Primer problema:
Un comercio que vende artículos de informática almacena los datos de sus artículos en una tabla 
denominada "articulos".
1- Elimine la tabla si existe:
 if object_id('articulos') is not null
  drop table articulos;

2- Cree la tabla, con la siguiente estructura:
 create table articulos(
  codigo int identity,
  tipo varchar(30),
  descripcion varchar(40),
  precio decimal(8,2),
  stock int,
  constraint PK_articulos primary key (codigo)
 );

3- Ingrese algunos registros:
 insert into articulos values ('impresora','Epson Stylus C45',400,100);
 insert into articulos values ('impresora','Epson Stylus C85',500,200);
 insert into articulos values ('impresora','Epson Stylus Color 600',400,0);
 insert into articulos values ('monitor','Samsung 14',900,0);
 insert into articulos values ('monitor','Samsung 17',1200,0);
 insert into articulos values ('monitor','xxx 15',1500,0);
 insert into articulos values ('monitor','xxx 17',1600,0);
 insert into articulos values ('monitor','zzz 15',1300,0);

4- Cree un disparador para controlar que no se elimine un artículo si hay stock. El disparador se 
activará cada vez que se ejecuta un "delete" sobre "articulos", controlando el stock, si se está 
eliminando un artículo cuyo stock sea mayor a 0, el disparador debe retornar un mensaje de error y 
deshacer la transacción.

5- Solicite la eliminación de un articulo que no tenga stock.
Se activa el disparador y permite la transacción.

6- Intente eliminar un artículo para el cual haya stock.
El trigger se dispara y deshace la transacción. Puede verificar que el artículo no fue eliminado 
consultando la tabla "articulos".

7- Solicite la eliminación de varios artículos que no tengan stock.
Se activa el disparador y permite la transacción. Puede verificar que se borraron 2 artículos 
consultando la tabla "articulos".

8- Intente eliminar varios artículos, algunos con stock y otros sin stock.
El trigger se dispara y deshace la transacción, es decir, ningún artículo fue eliminado, tampoco los 
que tienen stock igual a 0.

9- Cree un trigger para evitar que se elimine más de 1 artículo.
Note que hay 2 disparadores para el mismo suceso (delete) sobre la misma tabla.

10- Solicite la eliminación de 1 artículo para el cual no haya stock.
Ambos disparadores "DIS_articulos_borrar" y "DIS_articulos_borrar2" se activan y permiten la 
transacción.

11- Solicite la eliminación de 1 artículo que tenga stock.
El disparadores "DIS_articulos_borrar" se activa y no permite la transacción. El disparador 
"DIS_articulos_borrar2" no llega a activarse.

12- Solicite la eliminación de 2 artículos para los cuales no haya stock.
El disparador "DIS_articulos_borrar" se activa y permite la transacción pero el disparador 
"DIS_articulos_borrar2" no permite la transacción.

13- Solicite la eliminación de 2 artículos para los que haya stock.
El disparador "DIS_articulos_borrar" se activa y no permite la transacción. El disparador 
"DIS_articulos_borrar2" no llega a activarse.
Ver solución

 if object_id('articulos') is not null
  drop table articulos;

 create table articulos(
  codigo int identity,
  tipo varchar(30),
  descripcion varchar(40),
  precio decimal(8,2),
  stock int,
  constraint PK_articulos primary key (codigo)
 );

 insert into articulos values ('impresora','Epson Stylus C45',400,100);
 insert into articulos values ('impresora','Epson Stylus C85',500,200);
 insert into articulos values ('impresora','Epson Stylus Color 600',400,0);
 insert into articulos values ('monitor','Samsung 14',900,0);
 insert into articulos values ('monitor','Samsung 17',1200,0);
 insert into articulos values ('monitor','xxx 15',1500,0);
 insert into articulos values ('monitor','xxx 17',1600,0);
 insert into articulos values ('monitor','zzz 15',1300,0);

 create trigger DIS_articulos_borrar
  on articulos
  for delete
  as 
   if exists(select *from deleted where stock>0)--si algun registro borrado tiene stock
   begin
    raiserror('No puede eliminar artículos que tienen stock',16,1)
    rollback transaction
   end
   else
   begin
     declare @cantidad int
     select @cantidad=count(*) from deleted
     select 'Se eliminaron ' +rtrim(cast(@cantidad as char(10)))+ ' registros'
   end;

 delete from articulos where codigo=4;

 delete from articulos where codigo=2;

 delete from articulos where descripcion like '%xx%';

 delete from articulos where codigo<=3;

 create trigger DIS_articulos_borrar2
  on articulos
  for delete
  as
   declare @cantidad int
   select @cantidad=count(*) from deleted
   if @cantidad>1
   begin
    raiserror('No puede eliminar más de 1 artículo',16,1)
    rollback transaction
   end;

 delete from articulos where codigo=3;

 delete from articulos where codigo=2;

 delete from articulos where tipo='monitor';

 delete from articulos where tipo='impresora';



 

Retornar