-- procedimiento almacenado para crear base de datos "bd_proc_trigger"
create proc crear_base_de_datoss
as begin create database Mis_Ejercicios_Triggerr end; exec crear_base_de_datoss -- crear tablas en la base de datos creada use Mis_Ejercicios_Triggerr create procedure pa_crear_libros as create table libros( codigo int identity, titulo varchar(40), autor varchar(30), editorial varchar(20), precio decimal(5,2), stock int, primary key(codigo) ); exec pa_crear_libros; select * from libros -- crear la tabla ventas create procedure pa_crear_ventas as create table ventas( codigo_v int identity, cant_v int, fecha datetime, cod_l int, primary key(codigo_v) ); exec pa_crear_ventas select * from ventas -- insertar libros con un procedimiento almacenado create proc insertar_libro @t varchar(30),@a varchar(40),@e varchar(50),@p decimal(5,2),@s int as insert into libros values(@t,@a,@e,@p,@s) exec insertar_libro 'c++','deitel','Mc graw hill',67.7,5 select * from libros select * from ventas -- disparador para avisar si existe o no el libro que se quiere comprar
create trigger verificar_existencia on ventas for insert --LAS MAS COMPLICADA
as declare @id_libro int --VAIRABLE select @id_libro=inserted.cod_l from inserted if not exists (select * from libros where codigo=@id_libro) begin raiserror('No existe el libro que desea vender',10,1) rollback tran--PASO ATRAZ IMPEDIRRRRR SI PERIMIT O O B' NO end; insert E ESTA select select
into ventas values(5,'12-12-13',1)--EL ULTIMO VALOR ES LA CLAVE POR ESO S
INSERTANDO SI HAY CODIGO NO SE INSET * from ventas * from libros
-- Creamos un trigger sobre la tabla "ventas" para el evento de insercin. Cada ve
z que se realiza un "insert" sobre "ventas" -- el disparador se ejecuta. El disparador controla que la cantidad que se inten ta vender sea menor o igual al stock --del libro y actualiza el campo "stock" de "libros", restando al valor anterior la cantidad vendida: drop trigger ventas_insertar create trigger ventas_insertar on ventas for insert as declare @stock int select @stock= l.stock from libros l,inserted i where (l.codigo=i.cod_l) if (@stock>=(select cant_v from inserted)) update libros set stock=stock-inserted.cant_v from libros, inserted where libros.codigo=inserted.cod_l else begin raiserror ('Hay menos libros en stock de los solicitados para la venta', 16, 1) rollback transaction end insert into ventas values(455,'12-12-12',2) select * from ventas select * from libros insert into ventas values(2,'12-12-12',1) -- trigger para que cada vez que se elimine un registro de "ventas", se actualic e el campo "stock" de la tabla "libros" --(por ejemplo, si el comprador devuelve los libros comprados): create trigger ventas_borrar on ventas for delete as update libros set stock= libros.stock+deleted.cant_v from libros,deleted where deleted.cod_l=libros.codigo; delete from ventas where codigo_v=1
select * from libros
select * from ventas -- disparador se crea para controlar que no se elimine ms de un registro de la ta bla "libros". --El disparador se activa cada vez que se elimina un registro o varios, controla ndo la cantidad de registros --que se estn eliminando; si se est eliminando ms de un registro, el disparador ret orna un mensaje de error --y deshace la transaccin: create trigger libros_borrar on libros for delete as if (select count(*) from deleted) > 1 begin raiserror('No puede borrar ms de un libro',16,1) rollback transaction end; exec insertar_libro 'C++','deitel','Mc graw hill',67.7,23 exec insertar_libro 'Delphi','deitel','Mc graw hill',21,4 exec insertar_libro 'Java','deitel','Mc graw hill',90,265 select * from libros delete from libros -- El siguiente disparador de actualizacin se crea para evitar que se modifiquen los datos de la tabla "libros": create trigger libros_actualizar on libros for update as raiserror('Los datos de la tabla "libros" no pueden modificarse', 10, 1) rollback transaction update libros set autor='joyanes' where codigo=1 select * from libros drop trigger libros_actualizar -- Creamos un disparador que evite que se actualice el campo "precio" de la tabl a "libros": create trigger libros_actualizar_precio on libros for update as if update(precio) begin raiserror('El precio de un libro no puede modificarse.', 10, 1) rollback transaction end; drop trigger libros_actualizar_precio update libros set precio=666 where codigo=1 select * from libros -- Creamos un disparador de actualizacin que muestra el valor anterior y nuevo va lor de los registros actualizados en libros: -- controle si la actualizacin se realiza en ciertos campos permitidos (titulo, a
utor y editorial) y no en los
--campos prohibidos (precio y stock)); si se modifican los campos permitidos y n inguno de los no permitidos, -- mostrar los antiguos y nuevos valores create trigger valor_ant_nuevo_libros on libros for update as if (update(titulo) or update(autor) or update(editorial)) and not (update(precio) or update(stock)) begin select d.codigo, (d.titulo+'-'+ d.autor+'-'+d.editorial) as 'registro anterior', (i.titulo+'-'+ i.autor+'-'+i.editorial) as 'registro actualizado' from deleted d, inserted i where d.codigo=i.codigo end else begin raiserror('El precio y stock no pueden modificarse. La actualizacin no se rea liz.', 10, 1) rollback transaction end; update libros set precio=777 where codigo=1 update libros set autor='Joyanes' where codigo=1 select * from libros -- PROBLEMA PARA EL USO DE TRIGGERS -- Un club almacena los datos de sus socios en una tabla denominada "socios", la s inscripciones en "inscriptos" --y en otra tabla "morosos" guarda los documentos de los socios que deben matrcul as. -- tabla socios create table socios( documento char(8) not null, nombre varchar(30), domicilio varchar(30), primary key(documento) ); -- tabla inscriptos create table inscriptos( numero int identity, documento char(8) not null, deporte varchar(20), matricula char(1), foreign key (documento)references socios(documento), ); -- tabla morosos create table morosos( documento char(8) not null );
-- Insercion en las tablas creadas
insert into socios values('22222222','Ana Acosta','Bolivar 320'); insert into socios values('23333333','Bernardo Bustos','Tarija 2'); insert into socios values('24444444','Carlos Caceres','Colon 382'); insert into socios values('25555555','Mariana Morales','Colombia 234'); select * from socios 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'); select * from inscriptos select * from morosos insert into morosos values('22222222'); insert into morosos values('23333333'); -- Creamos un trigger para evitar que se inscriban socios que deben matrculas y n o permitir que se eliminen -- las inscripciones de socios deudores. El trigger se define para ambos eventos en la misma sentencia de creacin. create trigger inscriptos_insert_delete on inscriptos for insert,delete as if exists (select *from inserted,morosos where morosos.documento=inserted.documento) begin raiserror('El socio es moroso, no puede inscribirse en otro curso', 10, 1) rollback transaction end else if exists (select *from deleted,morosos where morosos.documento=deleted.documento) begin raiserror('El socio debe matriculas, no puede borrarse su inscripcion', 1 6, 1) rollback transaction end else if (select matricula from inserted)='n' insert into morosos select documento from inserted; insert into inscriptos values('25555555','tenis','s'); insert into inscriptos values('25555555','natacion','n'); select * from inscriptos select * from socios select * from morosos insert into inscriptos values('25555555','basquet','s'); -- eliminacion de un socio no deudor delete inscriptos where numero=5;
-- eliminar un socio deudor
delete inscriptos where numero=3; -- "crear un trigger que al eliminar un socio si no es deudor lo elimine tanto d e inscriptos como el socio en si" --simular primero la eliminacion por ejemplo "delete from inscriptos where docum ento=24444444" -- Luego simular la eliminacion "delete from socios where documento=24444444"