28-02-2019, 09:49
Gente, me saqué esta materia del orto por fin. Hice todos los puntos menos un v-f asi que lo que hice está todo bien (metí un 9 milagroso)
TEORÍA:
1a) ni la mas pálida idea
1b) V (Segun leí... solo sql server acepta 1 unico null para unique, pero así y todo me la tomaron como bien)
2a y 2b) Nada raro... ACID tal cual está en wikipedia, Triggers tal cual está en los apuntes de Zaffaroni
PRÁCTICA:
3a) Aca la opción es la 4 (Ésta practicamente la contestó Reinosa cuando le pregunté si el "campoA" tenía valores unicos, a lo que contestó: "para el resultado no importa". Asi que por descarte era la 4)
3b) Acá metí 2 triggers after, uno en Persona (Insert/update porque si se borra una persona la fk no importa) y otro en Ciudades (Solo para Delete porque si se inserta una Ciudad la fk no importa y un update de una PK no se puede hacer). La otra cosa a tener en cuenta eran las operaciones masivas, que lo resolví contando cuantas no cumplian la condición y si ese numero era > 0 => hacer un rollback. Aca esta el codigo:
CREATE trigger t1 ON Persona AFTER Insert, Update
AS
BEGIN
IF ( select count(*) from Inserted where Ciudad not in (select idCiudad from Ciudades) ) > 0
BEGIN
RAISERROR('Error', 16, 1)
ROLLBACK TRANSACTION
END
END
CREATE trigger t2 ON Ciudades AFTER Delete
AS
BEGIN
IF ( select count(*) from Deleted where idCiudad in (select distinct Ciudad from Persona) ) > 0
BEGIN
RAISERROR('Error', 16, 1)
ROLLBACK TRANSACTION
END
END
Espero que le sirva a alguien.
Saludos.
TEORÍA:
1a) ni la mas pálida idea
1b) V (Segun leí... solo sql server acepta 1 unico null para unique, pero así y todo me la tomaron como bien)
2a y 2b) Nada raro... ACID tal cual está en wikipedia, Triggers tal cual está en los apuntes de Zaffaroni
PRÁCTICA:
3a) Aca la opción es la 4 (Ésta practicamente la contestó Reinosa cuando le pregunté si el "campoA" tenía valores unicos, a lo que contestó: "para el resultado no importa". Asi que por descarte era la 4)
3b) Acá metí 2 triggers after, uno en Persona (Insert/update porque si se borra una persona la fk no importa) y otro en Ciudades (Solo para Delete porque si se inserta una Ciudad la fk no importa y un update de una PK no se puede hacer). La otra cosa a tener en cuenta eran las operaciones masivas, que lo resolví contando cuantas no cumplian la condición y si ese numero era > 0 => hacer un rollback. Aca esta el codigo:
CREATE trigger t1 ON Persona AFTER Insert, Update
AS
BEGIN
IF ( select count(*) from Inserted where Ciudad not in (select idCiudad from Ciudades) ) > 0
BEGIN
RAISERROR('Error', 16, 1)
ROLLBACK TRANSACTION
END
END
CREATE trigger t2 ON Ciudades AFTER Delete
AS
BEGIN
IF ( select count(*) from Deleted where idCiudad in (select distinct Ciudad from Persona) ) > 0
BEGIN
RAISERROR('Error', 16, 1)
ROLLBACK TRANSACTION
END
END
Espero que le sirva a alguien.
Saludos.