Sie sind auf Seite 1von 6

-- 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"

Das könnte Ihnen auch gefallen