Files
ITMO/DB/DBLab3/trigger.sql
T
LeterZP 82a7c04b5a Add 'DB/DBLab3/' from commit '5fc082aed9b5eb584269e5f3498fa35b669125b7'
git-subtree-dir: DB/DBLab3
git-subtree-mainline: 71fa30ebd9
git-subtree-split: 5fc082aed9
2026-04-24 01:07:05 +03:00

39 lines
1.2 KiB
PL/PgSQL

CREATE TYPE ftimes AS (creation_time DATE, disposal_time DATE);
CREATE FUNCTION check_frames()
RETURNS TRIGGER AS $$
DECLARE
all_times ftimes[];
element ftimes;
flag BOOL := false;
BEGIN
SELECT ARRAY(
SELECT DISTINCT row(frame.creation_time, frame.disposal_time)::ftimes FROM frame
JOIN galaxy ON frame.galaxy_name = galaxy.galaxy_name
JOIN nebula ON nebula.galaxy_name = galaxy.galaxy_name
JOIN star ON star.nebula_name = nebula.nebula_name
JOIN human ON human.passport_id = frame.human
WHERE NEW.star_name = star.star_name AND NEW.human = human.passport_id
) INTO all_times;
FOREACH element IN ARRAY all_times LOOP
IF (NEW.collision_time BETWEEN element.creation_time AND element.disposal_time) THEN
flag = true;
END IF;
END LOOP;
IF NOT flag AND (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
RAISE EXCEPTION 'Запись не может быть создана или изменена, так как данное взаимодействие не было замечено в установленной раме';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER register_collision_time
BEFORE INSERT OR UPDATE ON star_collision
FOR EACH ROW
EXECUTE FUNCTION check_frames();