96 lines
2.6 KiB
PL/PgSQL
96 lines
2.6 KiB
PL/PgSQL
-- a) Parents are not younger than their offsprings
|
|
CREATE FUNCTION HW4a_function()
|
|
RETURNS TRIGGER
|
|
LANGUAGE PLPGSQL
|
|
AS $$
|
|
BEGIN
|
|
IF ((SELECT birthdate FROM specimen WHERE specimen.eid = new.eid)>
|
|
(SELECT birthdate FROM specimen WHERE specimen.eid = new.parent)) THEN
|
|
RETURN NEW;
|
|
ELSE
|
|
RAISE EXCEPTION 'Parents cannot be younger than their offsprings!';
|
|
RETURN NULL;
|
|
END IF;
|
|
END;
|
|
$$;
|
|
CREATE TRIGGER HW4a_trigger
|
|
BEFORE INSERT on ancestry
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION HW4a_function();
|
|
|
|
-- b) AnimalSpecies Habitat information must coincide with the Habitat table.
|
|
-- Temperature should not differ more than 5 degrees of what the species needs.
|
|
CREATE FUNCTION HW4b_function()
|
|
RETURNS TRIGGER
|
|
LANGUAGE PLPGSQL
|
|
AS $$
|
|
BEGIN
|
|
IF EXISTS(SELECT FROM Habitat WHERE Habitat.name = new.Habitat)
|
|
THEN
|
|
IF EXISTS(SELECT FROM Habitat WHERE Habitat.name = new.Habitat
|
|
AND (new.Temperature BETWEEN (Habitat.Temperature-5.0) AND (Habitat.Temperature+5.0)))
|
|
THEN
|
|
RETURN NEW;
|
|
ELSE
|
|
RAISE EXCEPTION 'Temperature is outside the range the species needs!';
|
|
RETURN NULL;
|
|
END IF;
|
|
ELSE
|
|
RAISE EXCEPTION 'Habitat does not exist!';
|
|
RETURN NULL;
|
|
END IF;
|
|
END;
|
|
$$;
|
|
CREATE TRIGGER HW4b_trigger
|
|
BEFORE INSERT on AnimalSpecies
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION HW4b_function();
|
|
|
|
-- c) If a compound (Habitat) becomes overbooked then we need a warning.
|
|
-- Throws warning if number of animals in a habitat is larger than the habitat's size
|
|
CREATE FUNCTION HW4c_function()
|
|
RETURNS TRIGGER
|
|
LANGUAGE PLPGSQL
|
|
AS $$
|
|
|
|
BEGIN
|
|
IF ((select count(*) as num FROM specimen WHERE hid=new.hid GROUP BY hid)>=
|
|
(select "size" FROM habitat WHERE hid=new.hid))
|
|
THEN
|
|
RAISE NOTICE 'Habitat overcrowding!';
|
|
RETURN NEW;
|
|
ELSE
|
|
RETURN NEW;
|
|
END IF;
|
|
END;
|
|
$$;
|
|
CREATE TRIGGER HW4c_trigger
|
|
BEFORE INSERT on Specimen
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION HW4c_function();
|
|
|
|
-- d) Offsprings have at MOST one male, one female parent. Consider NULLS
|
|
-- NOTE: I do not understand what "Consider NULLS" here means
|
|
CREATE FUNCTION HW4d_function()
|
|
RETURNS TRIGGER
|
|
LANGUAGE PLPGSQL
|
|
AS $$
|
|
BEGIN
|
|
IF (((SELECT COUNT(*) FROM (SELECT a1.eid, a1.parent, s1.gender FROM ancestry a1
|
|
JOIN specimen s1 on parent=s1.eid WHERE s1.gender='F' AND a1.eid=new.eid) AS h) = 1)
|
|
AND ((SELECT COUNT(*) FROM (SELECT a1.eid, a1.parent, s1.gender FROM ancestry a1
|
|
JOIN specimen s1 on parent=s1.eid WHERE s1.gender='M' AND a1.eid=new.eid) AS h) = 1))
|
|
THEN
|
|
RAISE EXCEPTION 'Offsprings can only have at MOST one male, one female parent!';
|
|
RETURN NULL;
|
|
ELSE
|
|
RETURN NEW;
|
|
END IF;
|
|
END;
|
|
$$;
|
|
CREATE TRIGGER HW4d_trigger
|
|
BEFORE INSERT on Ancestry
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION HW4d_function();
|
|
|