diff --git a/DB/DBLab3/create.sql b/DB/DBLab3/create.sql new file mode 100644 index 0000000..8cac69d --- /dev/null +++ b/DB/DBLab3/create.sql @@ -0,0 +1,11 @@ +BEGIN; +CREATE TYPE star_colors AS ENUM ('коричневый', 'красный', 'оранжевый', 'жёлтый', 'жёлто-белый', 'белый', 'бело-голубой', 'голубой', 'звезда Вольфа-Райе'); +CREATE TYPE star_types AS ENUM ('карлик', 'гигант', 'сверхгигант', 'сверхновая'); +CREATE TABLE human (passport_id CHAR(6) PRIMARY KEY, name VARCHAR(50) NOT NULL, surname VARCHAR(50) NOT NULL, last_name VARCHAR(50), birth_date TIMESTAMP NOT NULL); +CREATE TABLE galaxy (galaxy_name VARCHAR(50) PRIMARY KEY, galaxy_size VARCHAR(10) NOT NULL); +CREATE TABLE nebula (nebula_name VARCHAR(50) PRIMARY KEY, galaxy_name VARCHAR(50) REFERENCES galaxy(galaxy_name), nebula_size VARCHAR(10) NOT NULL); +CREATE TABLE star (star_name VARCHAR(50) PRIMARY KEY, nebula_name VARCHAR(50) REFERENCES nebula(nebula_name), star_type star_types NOT NULL DEFAULT 'карлик', star_color star_colors NOT NULL DEFAULT 'красный'); +CREATE TABLE planet (planet_name VARCHAR(50) PRIMARY KEY, star_name VARCHAR(50) REFERENCES star(star_name), planet_size REAL NOT NULL, planet_atmosphere BOOL, planet_life BOOL); +CREATE TABLE star_collision (id SERIAL PRIMARY KEY, star_name VARCHAR(50) REFERENCES star(star_name), human CHAR(6) REFERENCES human(passport_id), collision_time TIMESTAMP NOT NULL); +CREATE TABLE frame (frame_id SERIAL PRIMARY KEY, human CHAR(6) REFERENCES human(passport_id), galaxy_name VARCHAR(50) REFERENCES galaxy(galaxy_name), creation_time DATE NOT NULL, disposal_time DATE NOT NULL); +END; diff --git a/DB/DBLab3/delete.sql b/DB/DBLab3/delete.sql new file mode 100644 index 0000000..c7f272f --- /dev/null +++ b/DB/DBLab3/delete.sql @@ -0,0 +1,11 @@ +DROP TABLE IF EXISTS frame; +DROP TABLE IF EXISTS star_collision; +DROP TABLE IF EXISTS planet; +DROP TABLE IF EXISTS star; +DROP TABLE IF EXISTS nebula; +DROP TABLE IF EXISTS galaxy; +DROP TABLE IF EXISTS human; +DROP TYPE IF EXISTS star_colors; +DROP TYPE IF EXISTS star_types; +DROP TYPE IF EXISTS ftimes; +DROP FUNCTION IF EXISTS check_frames(); diff --git a/DB/DBLab3/insert1.sql b/DB/DBLab3/insert1.sql new file mode 100644 index 0000000..04b9077 --- /dev/null +++ b/DB/DBLab3/insert1.sql @@ -0,0 +1,19 @@ +BEGIN; +INSERT INTO human VALUES (574212, 'Петр', 'Иванов', 'Сергеевич', TIMESTAMP '1988-04-10 16:49:21'); +INSERT INTO human(passport_id, name, surname, birth_date) VALUES (962459, 'Иван', 'Иванов', TIMESTAMP '1994-10-26 04:01:51'); +INSERT INTO human VALUES (147012, 'Алексей', 'Закруткин', 'Иванович', TIMESTAMP '2002-07-08 21:16:14'); +INSERT INTO human VALUES (012325, 'Илья', 'Трипаев', 'Олегович', TIMESTAMP '2014-01-02 01:23:58'); +INSERT INTO galaxy VALUES ('Большое Магелланово Облако', '9.9 кпк'); +INSERT INTO galaxy VALUES ('Млечный Путь', '16 кпк'); +INSERT INTO nebula VALUES ('Туманность Тарантул', 'Большое Магелланово Облако', '30’ x 20’'); +INSERT INTO nebula VALUES ('Туманность Ориона', 'Млечный Путь', '12 пк'); +INSERT INTO star VALUES ('R136a1', 'Туманность Тарантул', 'сверхгигант', 'звезда Вольфа-Райе'); +INSERT INTO star VALUES ('R136c', 'Туманность Тарантул', 'сверхгигант', 'звезда Вольфа-Райе'); +INSERT INTO star VALUES ('Orionis A', 'Туманность Ориона', 'карлик', 'бело-голубой'); +INSERT INTO star VALUES ('Orionis C', 'Туманность Ориона', 'карлик', 'голубой'); +INSERT INTO star VALUES ('2MASS J05352184–0546085', 'Туманность Ориона', 'карлик', 'коричневый'); +INSERT INTO planet(planet_name, star_name, planet_size) VALUES ('Proplyd 133-353', '2MASS J05352184–0546085', 7.4); +INSERT INTO frame(human, galaxy_name, creation_time, disposal_time) VALUES (574212, 'Большое Магелланово Облако', '2001-10-12', '2001-10-14'); +INSERT INTO frame(human, galaxy_name, creation_time, disposal_time) VALUES (012325, 'Млечный Путь', '2020-12-27', '2020-12-29'); +INSERT INTO frame(human, galaxy_name, creation_time, disposal_time) VALUES (574212, 'Большое Магелланово Облако', '2001-10-17', '2001-10-20'); +END; diff --git a/DB/DBLab3/insert2.sql b/DB/DBLab3/insert2.sql new file mode 100644 index 0000000..442652f --- /dev/null +++ b/DB/DBLab3/insert2.sql @@ -0,0 +1,17 @@ +INSERT INTO star_collision(human, star_name, collision_time) VALUES (574212, 'R136a1', TIMESTAMP '2001-10-12 14:16:49'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (012325, 'R136c', TIMESTAMP '2020-12-27 04:02:18'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (147012, 'Orionis C', TIMESTAMP '2001-07-08 21:16:14'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (962459, 'Orionis A', TIMESTAMP '2004-05-10 16:47:29'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (574212, 'R136a1', TIMESTAMP '2001-10-13 01:27:28'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (962459, 'R136a1', TIMESTAMP '2004-05-10 18:49:31'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (012325, 'Orionis C', TIMESTAMP '2020-12-28 17:46:09'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (147012, 'Orionis C', TIMESTAMP '2014-07-08 21:16:14'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (574212, 'Orionis C', TIMESTAMP '2001-10-17 15:16:37'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (574212, '2MASS J05352184–0546085', TIMESTAMP '2001-10-18 03:17:30'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (012325, 'Orionis A', TIMESTAMP '2020-12-28 23:11:32'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (962459, 'R136c', TIMESTAMP '2010-05-10 20:51:33'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (147012, 'Orionis C', TIMESTAMP '2012-07-08 21:16:14'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (574212, 'R136a1', TIMESTAMP '2001-10-18 22:09:29'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (962459, 'R136c', TIMESTAMP '2004-05-10 22:53:35'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (012325, 'Orionis C', TIMESTAMP '2023-12-29 00:00:14'); +INSERT INTO star_collision(human, star_name, collision_time) VALUES (574212, 'R136a1', TIMESTAMP '2001-10-19 00:00:00'); diff --git a/DB/DBLab3/report.pdf b/DB/DBLab3/report.pdf new file mode 100644 index 0000000..fb5bc3b Binary files /dev/null and b/DB/DBLab3/report.pdf differ diff --git a/DB/DBLab3/trigger.sql b/DB/DBLab3/trigger.sql new file mode 100644 index 0000000..7bc23a0 --- /dev/null +++ b/DB/DBLab3/trigger.sql @@ -0,0 +1,38 @@ +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(); + +