@Sofia1996

Как проверить 2 ячейки с разных таблиц с помощью триггера в PostgreSQL?

Всем добрый день! Прочитала в инете что могла, но пока не получилось у меня ничего, может сможете мне помочь? :(
Дело в том, что у меня существуют 4 таблицы:
  • Кафедры (Название_кафедры)
  • Предметы (Название_предмета, id_Кафедры)
  • Преподаватели (ФИО, Учёная_степень, id_Кафедры)
  • Ведомые_предметы (id_Предмета, id_Преподавателя)

Суть в том, чтобы перед тем, как ввести запись в таблицу Ведомые_предметы, где каждый преподаватель закрепляется за предметом своей кафедры. Чтобы человек не мог на пару физики или выш мата поставить физрука, например. Триггер должен срабатывать перед тем, как добавить запись в таблицу. Т.е. в функции проверяется id кафедр предметов и преподов, действительно ли они совпадают. Прошу помощи, а то не могу сама разобраться в этом(
P.S. Кое-что попробовала набросать, почти получилось, но выдаёт ошибку5cdc1a2e2b4e6523927750.png.
5cdc38bf7fea6666162201.png
CREATE TABLE Преподаватели
(
	ID_Преподавателя SERIAL PRIMARY KEY,
	ФИО CHARACTER VARYING(50) UNIQUE NOT NULL,
	Учёная_степень CHARACTER VARYING(30) NOT NULL,
	id_Кафедры INT NOT NULL,
	FOREIGN KEY (id_Кафедры) REFERENCES Кафедры (id_Кафедры),
	UNIQUE (ФИО, id_Кафедры),
	UNIQUE (ФИО, Учёная_степень),
	CHECK (Учёная_степень IN ('Преподаватель', 'Доцент', 'Профессор')),
	CHECK (ФИО != '')
);



CREATE TABLE Кафедры
(
	id_Кафедры SERIAL PRIMARY KEY,
	Название_кафедры CHARACTER VARYING(50) UNIQUE NOT NULL
);

CREATE TABLE Предметы
(
	id_Предмета SERIAL PRIMARY KEY,
	Название_предмета CHARACTER VARYING(50) NOT NULL UNIQUE,
	id_Кафедры INT NOT NULL,
	FOREIGN KEY (id_Кафедры) REFERENCES Кафедры (id_Кафедры),
	CHECK (Название_предмета != '' AND id_Кафедры != '1')
);

CREATE TABLE Ведомые_предметы
(
	id_Ведомого_предмета SERIAL PRIMARY KEY,
	id_Преподавателя INT NOT NULL,
	id_Предмета INT NOT NULL,
	FOREIGN KEY (id_Преподавателя) REFERENCES Преподаватели (id_Преподавателя),
	FOREIGN KEY (id_Предмета) REFERENCES Предметы (id_Предмета),
	UNIQUE (id_Преподавателя, id_Предмета)
);

CREATE OR REPLACE FUNCTION LecturerCheck() RETURNS trigger AS '
DECLARE
	Subject CHARACTER VARYING(50);
	Lecturer CHARACTER VARYING(30);
BEGIN
	select id_Кафедры into Subject from Предметы;
	select id_Кафедры into Lecturer from Преподаватели;
	if Subject = Lecturer then INSERT INTO Ведомые_предметы VALUES (NOW());
	else raise exception ''Error'';
	end if;
END;
' LANGUAGE plpgsql

CREATE TRIGGER tr_LecturerCheck 
BEFORE INSERT ON Ведомые_предметы FOR EACH ROW
EXECUTE PROCEDURE lecturercheck()
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы