Add 'DB/DBLab3/' from commit '5fc082aed9b5eb584269e5f3498fa35b669125b7'
git-subtree-dir: DB/DBLab3 git-subtree-mainline:71fa30ebd9git-subtree-split:5fc082aed9
This commit is contained in:
@@ -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;
|
||||
@@ -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();
|
||||
@@ -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;
|
||||
@@ -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');
|
||||
Binary file not shown.
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user