Sei sulla pagina 1di 27

Rocio Contreras Aguila

Segundo Semestre 2013


 Resumen breve materia Desencadenadores
clase anterior
 Ejercicios resueltos Desencadenadores
 Desarrollo actividad en clases utilizando la
función que valida el Rut ( tarea 3 c/nota).

 Recordatorio:
◦ Lunes 16 Solemne 2 tema: Vistas, funciones y
triggers.
 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.
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;
 Revisión:

 A) select *from empleados

 B) insert into empleados values('26666666','Federico


Fuentes','Francia 938',2,1000)

 C) insert into empleados values('27777777','Gaston


Garcia','Guemes 366',3,1200)

 D) select *from empleados; insert into empleados


values('27777777','Gaston Garcia','Guemes
366',9,1200)

 E) select *from empleados


 Un club de barrio almacena los datos de sus
socios en una tabla llamada "socios", los
datos de las inscripciones en una tabla
denominada "inscritos" y en una tabla
"morosos" almacena el documento de los
socios inscriptos que deben matrícula.
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 inscritos(
documento char(8) not null,
deporte varchar(30) not null,
matricula char(1),
constraint CK_inscritos check (matricula in ('s','n')),
constraint PK_inscritos primary key (documento,deporte),
constraint FK_inscritos_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 inscritos values ('22222222','tenis','s');


insert into inscritos values ('22222222','natacion','n');
insert into inscritos values ('23333333','tenis','n');
insert into inscritos values ('24444444','tenis','s');
insert into inscritos values ('24444444','futbol','s');

insert into morosos values ('22222222');


insert into morosos values ('23333333');
create trigger dis_incritos_insertar
on inscritos
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;
create trigger dis_incritos_insertar2
on inscritos
for insert
as
if (select matricula from inserted)='n'
insert into morosos select documento from
inserted;
create trigger dis_socios
on socios
for insert
as
raiserror('No puede ingresar nuevos socios',
16, 1)
rollback transaction;
 Primero, cree una tabla llamada Alumnos que
contenga el rut del alumno, separado del
dígito verificador, el nombre completo, la
fecha de nacimiento, la dirección ( calle,
número, ciudad, comuna) y sexo.
 Segundo, genere un trigger asociado a la
tabla que al insertar un nuevo registro, valide
que el dígito verificador del rut está correcto.
Para esto, utilizar la función desarrollada en
clases anteriores.
 Enviar por Blackboard como mensaje interno.
Una empresa almacena la información de sus
empleados en dos tablas llamadas
"empleados" y "secciones".
1.Crear una vista que arroje todos los datos de
los empleados , nombre, sección y cantidad
de hijos.
 Un profesor guarda las notas de sus alumnos
de un curso en una tabla llamada "alumnos"
que consta de los siguientes campos:

◦ nombre (30 caracteres),


◦ nota (valor entero entre 0 y 10, puede ser nulo),
create table alumnos(
nombre varchar(40),
nota tinyint,
constraint CK_alunos_nota check (nota>=0 and nota<=10)
);

 Ingresamos algunos registros:

insert into alumnos values('Ana Acosta',8);


insert into alumnos values('Carlos Caseres',4);
insert into alumnos values('Federico Fuentes',2);
insert into alumnos values('Gaston Guzman',3);
insert into alumnos values('Hector Herrero',5);
insert into alumnos values('Luis Luna',10);
insert into alumnos values('Marcela Morales',7);
insert into alumnos values('Marcela Morales',null);
 Queremos mostrar el nombre y nota de cada
alumno y en una columna extra llamada
"condicion" empleamos un case que testee la
nota y muestre un mensaje diferente si en
dicho campo hay un valor:

 - 0, 1, 2 ó 3: 'libre';
 - 4, 5 ó 6: 'regular';
 - 7, 8, 9 ó 10: 'promocionado';
 Esta es la sentencia:

 select nombre,nota, condicion=


 case nota
 when 0 then 'libre'
 when 1 then 'libre'
 when 2 then 'libre'
 when 3 then 'libre'
 when 4 then 'regular'
 when 5 then 'regular'
 when 6 then 'regular'
 when 7 then 'promocionado'
 when 8 then 'promocionado'
 when 9 then 'promocionado'
 when 10 then 'promocionado'
 end
 from alumnos;
 Obtenemos la misma salida pero empleando el
"case" con operadores de comparación:

select nombre, nota, condicion=


case
when nota<4 then 'libre'
when nota >=4 and nota<7 then 'regular'
when nota>=7 then 'promocionado'
else 'sin nota'
end
from alumnos;
 Vamos a agregar el campo "condicion" a la
tabla:

 alter table alumnos


 add condicion varchar(20);

 Veamos la tabla:

 select *from alumnos;


 Recordemos que se puede emplear una
expresión "case" en cualquier lugar en el que
pueda utilizar una expresión. Queremos
actualizar el campo "condicion" para guardar la
condición de cada alumno según su nota:

update alumnos set condicion=


case
when nota<4 then 'libre'
when nota between 4 and 7 then 'regular'
when nota >7 then 'promocionado'
end;
 Veamos la tabla actualizada:

 select *from alumnos;

 Note que el alumno sin nota contiene "null"


en "condición" porque no especificamos valor
para "else".
 Mostramos la cantidad de alumnos libres,
regulares y aprobados y en una columna extra
mostramos un mensaje, ordenamos por cantidad:

select condicion, count(*) as cantidad,resultado=


case condicion
when 'libre' then 'repitentes'
when 'regular' then 'rinden final'
when 'promocionado' then 'no rinden final'
else 'sin datos'
end
from alumnos
group by condicion
order by cantidad;
 1. Genere una función que calcule los
números de la serie Fibonacci. Ej, quiero el
número 5, debiera arrojar:5, si quiero el 3,
debiera arrojar el 2.
◦ Serie: 0 1 1 2 3 5 8 13 21 34 55 …

 2. Genere una función que calcule el factorial


de un número:
◦ 3! = 3 x 2 x 1
◦ 6! = 6 x 5 x 4 x 3 x 2 x 1
◦ 0! = 1

Potrebbero piacerti anche