Anda di halaman 1dari 5

DESARROLLO EXAMEN FINAL DE TALLER DE BASE DE DATOS 1.

Marcar las siguientes preguntas como verdadera o falsa segn los siguientes enunciados Sp_procoption,execute,exec Procedure dif. Trigger Trabaja sobre parmetros,genera reportes y registros Ejec dos tablas al mismo tiempo,trab con declaracin de variables ndice clustered dif. No clustered Asociado a la pk(ordenamineto fisico),se aplica los cambios a la tabla Puede trabajar hasta 256 en la tabla(logico),va a trabajar como un puntero Ejemp transacciones Open transaccin insert_cliente ----------------------apertura Insert into cliente values(1,colombia)----cuerpo,realiza las sentencias Commit transaction------------------cierra transaccin Rollback transaction-----------------deshace cambios hechos por tran. a. En una tabla se pueden considerar hasta 250 indices no clustered: Falso: son 250 indices en total de los cuales 249 son no clustered y 1 indice es clustered b. En un trigger, al usar una setencia INSERT es obligatorio utilizar la palabra INTO de la siguiente forma INSERT INTO Falso: No es necesario poner la palabra into al momento de insertar un trigger c. Los clustered indexes son ndices que controlan el orden fsico de las filas en la tabla por lo cual solo puede existir uno para cada tabla Verdadero: Solo puede haber un ndice agrupado por tabla , dado que estos ndices ordenan fsicamente la tabla segn la clave del ndice agrupado d. En un trigger, al usar una la funcin COUNT(*) incluye en su recuento las filas que contienen valores NULL Verdadero: La funcin count(*) tambin cuenta a las filas que tienen un valor de NULL en ellas. Para que no sean contables en lugar de COUNT(*) debemos escribir COUNT(cod_prod) e. Los no-clustered indexes son ndices que mantienen un sub conjunto de las columnas de la tabla en orden. Estos ndices modifican el orden de las filas de la tabla, en lugar de esto mantienen una lista ordenada de referencia a filas de la tabla original Verdadero: Los ndices no-clustered van despus de un nico ndice clustered es un puntero en una de las tablas despus de la de los clustered son referentes f. En una insercin los no-clustered indexes se degradan su performance mas que clustered indexes Verdadero: Debido a primero toma la performance de un ndice clustered para asi posteriormente tome la performance de un ndices no-clustered 2. De los siguientes extractos de cdigo SQL completar lo que falta o corregir lo incorrecto : a. Un cursor que emite (imprime) un listado de productos sin stock y que sus precios superen 30 y no exceda de 100. Declare @codigo int,@descripcion varchar(10),@precio money,@stock int Declare c_listado cursor scroll For Select cdigo,descripcin,precio,stock from producto Where stock is null and precio between 30 and 100 Open c_listado Fetch next from c_listado into @codigo,@descripcion,@precio,@stock While (@@fetch_status=0) Begin Print cast(@codigo as varchar(10) + +@descripcion+ +cast(@precio as varchar(10))+ +cast(@stock as varchar(10))) Fetch next from c_listado into @codigo,@descripcion,@precio,@stock End Close c_listado

Deallocate c_listado b. Tenemos una transaccin de nombre ventas que asegura la grabacin en las tablas CABPEDIDO, DOCUMENTOS Y STOCK y en caso de presentarse un error en la grabacin mostrar un error Begin transaction ventas Begin try Insert into CABPEDIDO values (id,fecha,idcliente,monto) Insert into DOCUMENTOS values (id_docu,descripcion) Insert into STOCK values (id,articulo,cantidad,precio) commit End try Begin catch Roollback Print ocurrio un error en la transaccion End catch c. Sobre la tabla pedido que tiene la siguiente estructura : idpedido int, fecha date, tdoc varchar(3), serie varchar(3), num int, monto money. Se requiere llevar el registro de la accin realizada en la tabla pedido y tener un log de los siguientes datos: idpedido, monto, tipo (I:inserccion, U:update, D:delete), fecha y hora servidor (ocurrencia de la transaccion) Crate trigger tr_auditoria On pedido For insert,update,delete As declare @ins int, declare @del int, declare @idpedido, declare @monto, declare @tipo, declare @fecha declare @fecha_hora Set @ins=(select count(*) from inserted) Set @del=(select count(*) from deleted) If (@ins>0) Begin Tipo =I Print este dato se inserto correctamente End If(@del>0) Begin Tipo=D Print este dato se borro corretamente End If(@ins=1 and @del=1) Begin Tipo=U Print este dato se actualizo correctamente end set @idpedido=(select idpedido from inserted) set @monto=(select monto from pedido where idpedido=@idpedido) set @fecha=(select fecha from pedido where idpedido=@idpedido) set @fecha_hora=(select getdate()) delete from pedido where idpedido=@idpedido insert log_pedido values (@idpedido,@monto,@fecha,@tipo,@fecha_hora)

3. Una tabla de gua (idguia, fecha, idcliente, monto, estado) y detguia (idguia, idarticulo, canti, precuni, subtotal) desarrollar un cursor para regresar el stock de los arituclos de una gua que su estado paso de valor E (entregado) a A(anulado). El saldo deber actualizarse en la tabla stock (idarticulo, saldo). Es decir deber adicionar el saldo con las cantidades del detalle de la gua anulada. Considerar el uso de transacciones para asegurar la grabacin de los datos ende la integridad de los mismos. Begin transaction Begin try Declare @idguia int, Delcare @estado varchar(3), Declare @articulo int, Declare @cant int Declare c_stock cursor For Select g.idguia,g.estado,dt.idarticulo,dt.canti from gua g inner join detguia dt on g.idguia=dt.idguia for update Open c_stock Fetch next from c_stock into @idguia,@estado,@idarticulo,@canti Set @estado=(select estado from gua where idguia=@idguia) While (@@fetch_status=0) If (@estado=anulado) Begin Update stock set saldo=saldo+@canti where idarticulo=@idarticulo End If(@estado=entregado) Begin Update stock set saldo=saldo-@canti where idarticulo=@idarticulo End Fetch next from c_stock into @idguia,@estado,@idarticulo,@canti Close c_stock Deallocate c_stock commit End try Begin catch Roolback transaction Print hubo un error en la transaccion End catch

4. Desarrollar un trigger de actualizacin sobre la tabla DETALLEALQUILER. Para que almacene los vehculos que fueron devueltos fuera de la fecha limite de devolucin. Con las sigute estructura: Idcliente idauto placa fechadevuelto

create trigger tr_update on DetalleAlquiler for insert as declare @feclim date declare @fecdevolver date declare @fecdevolucion date set @FecLim=(select fechalimitedevolucion from alquiler) set @FecDevolver=(select fechadevolver from inserted) set @FecDevolucion=(select fechadevolucion from inserted) insert vehiculos_devueltos select c.idcliente, v.idauto, v.placa, ins.fechadevolucion from cliente c inner join alquiler a on c.idcliente=a.idcliente inner join inserted ins on a.idalquiler=ins.idalquiler inner join vehiculo v on ins.idauto=v.idauto where FechaDevolucion not in (select fechadevolucion from inserted where @fecDevolucion between @fecdevolver and @feclim) create table vehiculos_devueltos( IdCliente int not null primary key, IdAuto int not null, Placa varchar(7), FechaDevuelto date) select * from vehiculos_devueltos 5. Desarrollar un trigger de insercin sobre la tabla ALQUILER, para que actualice el estado del vehiculo Obs: tabla ESTADO (A: apto M: mantenimiento Q:alquilado) create trigger tr_insert on Alquiler for insert as declare @estado int

declare @idalquiler int set @idalquiler=(select idalquiler from inserted) set @estado=(select v.idestado from vehiculo v inner join detallealquiler da on v.idauto=da.idauto inner join inserted ins on da.idalquiler=ins.idalquiler where ins.idalquiler=@idalquiler) if (@estado=200) begin update vehiculo set idestado=202 end else if (@estado=201) begin print ('Est en mantenimiento') rollback end else if (@estado=202) begin print ('Ya est alquilado') rollback end

Anda mungkin juga menyukai