UTNianos

Versión completa: [Aporte] Final Gestion de Datos 25/07/2017
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas, comparto lo que recuerdo del final, si alguien se acuerda del 1A o algo mas lo edito.
Me entregaron casi para el final, y me parece que nadie o casi nadie desaprobo.

1) V o F
A) Algo sobre el nivel de un arbol por transformada de knuth.
B) El nivel de aislamiento Repeteable Read acepta lecturas fantasmas

2) Preguntas a desarrollar
A) Indique y desarrolle dos objetos de la base de datos que aseguren integridad de datos
B) Comparar OLTP Y OLAP

3) Practica
A) Te daban 3 tablas
Pais
idPais
paisDetalle

Provincia
idPcia
idPais
habitantes

Ciudad
idCiudad
idProvincia

Pedia hacer un trigger tal que si se quiere insertar una provincia y esta no tenia ciudades, forzar que la cantidad de habitantes sea 0.

Hice algo asi pero tengo varias dudas:
CREATE TRIGGER in_Provincia ON Provincias INSTEAD OF INSERT
AS BEGIN
declare @idPcia int, @idPais int, @habitantes int

SELECT @idPcia = idPcia, @idPais = idPais, @habitantes = habitantes FROM INSERTED //No estoy seguro de esta sintaxis, ni tampoco si podian venir muchos filas
if(@habitantes > 0 AND select count(1) from ciudad where not exist (select 1 from ciudad where idPcia = @idPcia ) //Tampoco seguro de la sintaxis
begin
SET @habitantes = 0
end

INSERT INTO Provincia VALUES (@IdPcia, @IdPais, @habitantes)
END

B)
Te daban una query y el multiple choice de que sucedia
Creo que todo el mundo se sacó 6 jaja

A mi me parece que los prácticos eran un poco rebuscados. El 2do era A o B la respuesta? Tenía la duda si los null van arriba o abajo al ordenar ascendente, y terminé poniendo ambas opciones y explicando que dependía de la configuración de la BD (?)
Yo le puse la A porque cuando ordenas de forma ascendente quedan los null arriba, PERO cuando sali me di cuenta que no habia forma que haya nulos en la consulta porque tenia: isnull(habitantes,1).
A la salida le pregunte que onda al ayudante a ver si era un error de la consigna o si era una trampa (bastante innecesaria, lo importante del ejercicio estaba en otra parte). Me dijo que tenian que verlo porque habia "muchos grises", asi que se ve que no estaban muy de acuerdo con la redacción del final.
(26-07-2017 14:40)Camper escribió: [ -> ]Yo le puse la A porque cuando ordenas de forma ascendente quedan los null arriba, PERO cuando sali me di cuenta que no habia forma que haya nulos en la consulta porque tenia: isnull(habitantes,1).
A la salida le pregunte que onda al ayudante a ver si era un error de la consigna o si era una trampa (bastante innecesaria, lo importante del ejercicio estaba en otra parte). Me dijo que tenian que verlo porque habia "muchos grises", asi que se ve que no estaban muy de acuerdo con la redacción del final.

El tema es que en el order by estaba ordenado por habitantes no por el isnull. Osea yo entendi como que se referia a donde quedaban las filas con habitantes null, aunque al mostrarse aparezcan como 1.
Asi que supongo que si quedan arriba, era la A.
Si al isnull(habitantes,1) lo renombran como "habitantes", el order by es sobre la nueva columna.

Habria que ver el final para estar seguros.
Les comento que pude averiguar la respuesta del 3-B por boca del profesor y era la C. La trampita estaba en que como el where es de Max(habitantes) de alguna de las provincias del pais, si todas las provincias tenían habitantes en null (podía pasar) entonces el subselect del where da siempre falso. Por lo tanto, NO va a haber registros de provincias con null
Además, al no haber provincias con null, te aseguras que todas las provincias que se muestran en la consulta tienen al menos una ciudad (por la regla de negocio del punto 3-A)
Con eso dicho, ya descartas la A y la B (no solo por el tema del orden de los nulls sino también porque decían que los registros que traías no hablaban de que tenían que tener mínimo una ciudad)
(26-07-2017 22:46)GringoLixo escribió: [ -> ]Les comento que pude averiguar la respuesta del 3-B por boca del profesor y era la C. La trampita estaba en que como el where es de Max(habitantes) de alguna de las provincias del pais, si todas las provincias tenían habitantes en null (podía pasar) entonces el subselect del where da siempre falso. Por lo tanto, NO va a haber registros de provincias con null
Además, al no haber provincias con null, te aseguras que todas las provincias que se muestran en la consulta tienen al menos una ciudad (por la regla de negocio del punto 3-A)
Con eso dicho, ya descartas la A y la B (no solo por el tema del orden de los nulls sino también porque decían que los registros que traías no hablaban de que tenían que tener mínimo una ciudad)

Mira vos, lo pensé, pero creía que el valor máximo de habitantes devolvía null y terminaban quedando las provincias con null simplemente, mostrando el 1 por el isnull() del select principal. Muy tramposo.

Gracias por la info
Ah la re manquie... Y yo poniendo "era simple" jajaja

"WHERE prov.habitantes = (SELECT MAX(p.habitantes) FROM Provincia p WHERE p.idPais=prov.idPais )"

Claro, prov.habitantes = null no existe, bastante tramposo
Utnianos! Les subo el final de GDD del 25-07-17.

[Imagen: uHqNJNL.png]

No se olviden de agradecer! thumbup3
Lo resolví de esta forma:


CREATE TRIGGER trigger_final ON dbo.Provincia AFTER INSERT
AS
BEGIN
DECLARE @id_pcia int
DECLARE CURSOR cursor_final FOR
SELECT id_pcia FROM inserted

OPEN cursor_final
FETCH cursor_final INTO @id_pcia

WHILE @@FETCH_STATUS == 0
BEGIN
IF NOT EXISTS (SELECT id_ciudad FROM dbo.Provincia p
LEFT JOIN dbo.Ciudad c ON c.id_pcia = p.id_pcia
WHERE p.id_pcia = @id_pcia)
BEGIN
UPDATE dbo.Provincia
SET habitantes = 0
WHERE id_pcia = @id_pcia
END
FETCH cursor_final NEXT INTO @id_pcia
END

CLOSE cursor_final
DEALLOCATE cursor_final

URLs de referencia