Всем добрый день! Прочитала в инете что могла, но пока не получилось у меня ничего, может сможете мне помочь? :(
Дело в том, что у меня существуют 4 таблицы:
- Кафедры (Название_кафедры)
- Предметы (Название_предмета, id_Кафедры)
- Преподаватели (ФИО, Учёная_степень, id_Кафедры)
- Ведомые_предметы (id_Предмета, id_Преподавателя)
Суть в том, чтобы перед тем, как ввести запись в таблицу
Ведомые_предметы, где каждый преподаватель закрепляется за предметом своей кафедры. Чтобы человек не мог на пару физики или выш мата поставить физрука, например. Триггер должен срабатывать
перед тем, как добавить запись в таблицу. Т.е. в функции проверяется id кафедр предметов и преподов, действительно ли они совпадают. Прошу помощи, а то не могу сама разобраться в этом(
P.S. Кое-что попробовала набросать, почти получилось, но выдаёт ошибку.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()