· 7 years ago · Dec 08, 2018, 05:00 PM
1---------------------------------------------------------
2-- ДРОПЫ Ð’ ЗÐПИСКУ ÐЕ ВСТÐВЛЯТЬ
3---------------------------------------------------------
4DROP SEQUENCE IF EXISTS ПолПоÑлед CASCADE;
5DROP SEQUENCE IF EXISTS СемейноеПоложениеПоÑлед CASCADE;
6DROP SEQUENCE IF EXISTS КафедраПоÑлед CASCADE;
7DROP SEQUENCE IF EXISTS ПредметПоÑлед CASCADE;
8DROP SEQUENCE IF EXISTS ПреподавательПоÑлед CASCADE;
9DROP SEQUENCE IF EXISTS ТипÐагрузкиПоÑлед CASCADE;
10DROP SEQUENCE IF EXISTS ÐагрузкиПоÑлед CASCADE;
11
12
13DROP TABLE IF EXISTS Пол CASCADE;
14DROP TABLE IF EXISTS СемейноеПоложение CASCADE;
15DROP TABLE IF EXISTS Кафедры CASCADE;
16DROP TABLE IF EXISTS Предметы CASCADE;
17DROP TABLE IF EXISTS Преподаватели CASCADE;
18DROP TABLE IF EXISTS ТипыÐагрузки CASCADE;
19DROP TABLE IF EXISTS Ðагрузки CASCADE;
20
21
22DROP FUNCTION IF EXISTS ОбщÐагруз();
23DROP FUNCTION IF EXISTS КураторÑтво();
24DROP FUNCTION IF EXISTS УдалитьÐагрузки();
25
26
27DROP FUNCTION IF EXISTS РаÑÑчётСуммарнойÐагрузки(код_Ð¿Ñ€ÐµÐ¿Ð¾Ð´Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ int);
28DROP FUNCTION IF EXISTS РаÑÑчётÐалога(код_Ð¿Ñ€ÐµÐ¿Ð¾Ð´Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ int);
29
30---------------------------------------------------------
31-- РВОТ ВСÐ, ЧТО ÐИЖЕ - ВСТÐВЛЯТЬ
32---------------------------------------------------------
33
34
35--Пол препода
36CREATE SEQUENCE IF NOT EXISTS ПолПоÑлед;
37CREATE TABLE IF NOT EXISTS Пол
38(
39 Код int primary key default nextval('ПолПоÑлед'),
40 Тип varchar(64) NOT NULL
41);
42
43--Семейное положение
44CREATE SEQUENCE IF NOT EXISTS СемейноеПоложениеПоÑлед;
45CREATE TABLE IF NOT EXISTS СемейноеПоложение
46(
47 Код int primary key default nextval('СемейноеПоложениеПоÑлед'),
48 Положение varchar(64) NOT NULL
49);
50
51--Кафедра
52CREATE SEQUENCE IF NOT EXISTS КафедраПоÑлед;
53CREATE TABLE IF NOT EXISTS Кафедры
54(
55 Код int primary key default nextval('КафедраПоÑлед'),
56 Ðазвание varchar(128) NOT NULL
57);
58
59--Предмет
60CREATE SEQUENCE IF NOT EXISTS ПредметПоÑлед;
61CREATE TABLE IF NOT EXISTS Предметы
62(
63 Код int primary key default nextval('ПредметПоÑлед'),
64 Ðазвание varchar(128) NOT NULL
65);
66
67--Препод
68CREATE SEQUENCE IF NOT EXISTS ПреподавательПоÑлед;
69CREATE TABLE IF NOT EXISTS Преподаватели
70(
71 Код int primary key default nextval('ПреподавательПоÑлед'),
72 ФИО varchar(128) NOT NULL,
73 КодПол int NOT NULL, --МужÑкой, женÑкий или не определилÑÑ?
74 ÐÐ´Ñ€ÐµÑ varchar(256),
75 ÐšÐ¾Ð´Ð¡ÐµÐ¼ÐµÐ¹Ð½Ð¾Ð³Ð¾ÐŸÐ¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ int,
76 КодКафедры int NOT NULL,
77 ÐомерГруппы char(6),
78 КураторÑтво boolean,
79 foreign key (КодКафедры) references Кафедры (Код),
80 foreign key (КодПол) references Пол (Код),
81 foreign key (КодСемейногоПоложениÑ) references СемейноеПоложение (Код)
82);
83
84--Тип академичеÑкой нагрузки
85CREATE SEQUENCE IF NOT EXISTS ТипÐагрузкиПоÑлед;
86CREATE TABLE IF NOT EXISTS ТипыÐагрузки
87(
88 Код int primary key default nextval('ТипÐагрузкиПоÑлед'),
89 ÐазваниеТипа varchar(64) NOT NULL,
90 КоефÐагрузки int not null
91);
92
93--ÐкадемичеÑкие нагрузки
94CREATE SEQUENCE IF NOT EXISTS ÐагрузкиПоÑлед;
95CREATE TABLE IF NOT EXISTS Ðагрузки
96(
97 Код int primary key default nextval('ÐагрузкиПоÑлед'),
98 КодТипа int NOT NULL,
99 ÐšÐ¾Ð´ÐŸÑ€ÐµÐ¿Ð¾Ð´Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ int NOT NULL,
100 КодПредмета int NOT NULL,
101 foreign key (КодТипа) references ТипыÐагрузки (Код),
102 foreign key (КодПреподавателÑ) references Преподаватели (Код),
103 foreign key (КодПредмета) references Предметы (Код)
104);
105
106--Триггер куратор
107create function КураторÑтво() returns trigger as
108$$
109begin
110 IF new.ÐомерГруппы is not null THEN
111 new.КураторÑтво = true;
112 else
113 new.КураторÑтво = false;
114 end if;
115 RETURN NEW;
116end;
117$$ language 'plpgsql';
118
119create trigger куратор_ли
120 before insert
121 on Преподаватели
122 for each row
123execute procedure КураторÑтво();
124
125
126-- Проверка, чтобы преподаватель не перетрудилÑÑ
127create function ОбщÐагруз() returns trigger as
128$$
129begin
130 IF РаÑÑчётСуммарнойÐагрузки(new.Код) > 3 THEN
131 RETURN NULL;
132 end if;
133 RETURN NEW;
134end;
135$$ language 'plpgsql';
136
137create trigger провер_общ_нагруз
138 before insert
139 on Ðагрузки
140 for each row
141execute procedure ОбщÐагруз();
142
143-- ПодÑчёт нагрузки на преподавателÑ
144CREATE FUNCTION РаÑÑчётСуммарнойÐагрузки(код_Ð¿Ñ€ÐµÐ¿Ð¾Ð´Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ int) returns float as
145$$
146declare
147 общ_нагруз float;
148 Ñтрока record;
149begin
150 общ_нагруз := 0;
151 for Ñтрока in
152 select КодТипа from Ðагрузки where ÐšÐ¾Ð´ÐŸÑ€ÐµÐ¿Ð¾Ð´Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ = код_преподавателÑ
153 loop
154 общ_нагруз := общ_нагруз + (select КоефÐагрузки from ТипыÐагрузки where Код = Ñтрока.КодТипа);
155 end loop;
156 return общ_нагруз;
157end;
158$$ language 'plpgsql';
159
160-- РаÑÑчёт зарплаты Ð¿Ñ€ÐµÐ¿Ð¾Ð´Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² завиÑимоÑти от его нагрузки
161 -- ÐŸÑ€ÐµÐ¼Ð¸Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ меÑÑц, еÑли преподаватель ведёт больше одного предмета
162CREATE FUNCTION РаÑÑчётÐалога(код_Ð¿Ñ€ÐµÐ¿Ð¾Ð´Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ int) returns float as
163$$
164declare
165 налог float;
166 зарплата float;
167begin
168 зарплата := 10 * РаÑÑчётСуммарнойÐагрузки(код_преподавателÑ);
169 IF (код_Ð¿Ñ€ÐµÐ¿Ð¾Ð´Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ in (select Код from ШирокийПрофиль)) THEN
170 зарплата := зарплата + 1900;
171 end if;
172 IF ((select КураторÑтво from Преподаватели where Код = код_преподавателÑ) = true) THEN
173 зарплата := зарплата + 1700;
174 end if;
175 налог := (зарплата/100) * 18;
176
177 return налог;
178end;
179$$ language 'plpgsql';
180
181
182create or replace function УдалитьÐагрузки() returns trigger as
183$$
184begin
185 delete from Ðагрузки where (ÐšÐ¾Ð´ÐŸÑ€ÐµÐ¿Ð¾Ð´Ð°Ð²Ð°Ñ‚ÐµÐ»Ñ = old.Код);
186end;
187$$ language 'plpgsql';
188
189create trigger удал_нагруз
190 before delete
191 on Преподаватели
192 for each row
193execute procedure УдалитьÐагрузки();
194
195
196-- Преподаватели, которые ведут больше одного предмета
197CREATE VIEW ШирокийПрофиль AS
198select *
199from Преподаватели
200where ((select count(*) from Ðагрузки where Преподаватели.Код = Ðагрузки.КодПреподавателÑ) > 2);
201
202
203-- Преподаватели, которые выÑтавлÑÑ‚ зачёт или принимают Ñкзамен:
204CREATE VIEW Ðкзаменаторы AS
205SELECT *
206from Преподаватели
207where Код in (select КодПреподавателÑ
208 from Ðагрузки
209 where КодТипа in (select Код from ТипыÐагрузки where ÐазваниеТипа = 'Зачёт' or ÐазваниеТипа = 'Ðкзамен'));
210
211-- Кого поздравить Ñ 8 марта
212CREATE VIEW С8Марта AS
213select *
214from Преподаватели
215where КодПол in (select Код from Пол where Тип = 'ЖенÑкий' or Тип = 'Ðе определилÑÑ');
216
217
218
219INSERT INTO Пол
220VALUES (default, 'МужÑкой');
221INSERT INTO Пол
222VALUES (default, 'ЖенÑкий');
223INSERT INTO Пол
224VALUES (default, 'Ðе определилÑÑ');
225INSERT INTO СемейноеПоложение
226VALUES (default, 'Ðе в браке');
227INSERT INTO СемейноеПоложение
228VALUES (default, 'В браке');
229INSERT INTO СемейноеПоложение
230VALUES (default, 'Разведён');
231
232INSERT INTO Кафедры
233VALUES (default, 'Кафедра Информационных ÑиÑтем');
234INSERT INTO Кафедры
235VALUES (default, 'Кафедра СиÑтемного программного обеÑпечениÑ');
236
237INSERT INTO Предметы
238VALUES (default, 'ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð°Ð· данных и знаний');
239INSERT INTO Предметы
240VALUES (default, 'ÐÐ»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸ программирование');
241INSERT INTO Предметы
242VALUES (default, 'УкраинÑкий Ñзык');
243
244INSERT INTO Преподаватели
245VALUES (default, 'Ðндрей Петрович', (SELECT Код
246 FROM Пол
247 WHERE Тип
248 = 'Ðе определилÑÑ'), 'ул. КанатнаÑ, 74',
249 (SELECT Код FROM СемейноеПоложение WHERE Положение = 'В браке'),
250 (SELECT Код FROM Кафедры WHERE Ðазвание = 'Кафедра Информационных ÑиÑтем'), 'ÐИ-173');
251
252INSERT INTO ТипыÐагрузки
253VALUES (default, 'ЛекциÑ', 80);
254INSERT INTO ТипыÐагрузки
255VALUES (default, 'ПрактичеÑÐºÐ°Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°', 60);
256INSERT INTO ТипыÐагрузки
257VALUES (default, 'Ð›Ð°Ð±Ð¾Ñ€Ð°Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°', 50);
258INSERT INTO ТипыÐагрузки
259VALUES (default, 'Проверка курÑовой работы', 80);
260INSERT INTO ТипыÐагрузки
261VALUES (default, 'Зачёт', 90);
262INSERT INTO ТипыÐагрузки
263VALUES (default, 'Ðкзамен', 100);
264
265INSERT INTO Ðагрузки
266VALUES (default, 5, 1, 2);
267
268insert into Ðагрузки (КодТипа, КодПреподавателÑ, КодПредмета)
269values (6, 1, 1);
270
271insert into Ðагрузки (КодТипа, КодПреподавателÑ, КодПредмета)
272values (1, 1, 1);
273
274insert into Ðагрузки (КодТипа, КодПреподавателÑ, КодПредмета)
275values (1, 1, 2);
276
277insert into Ðагрузки (КодТипа, КодПреподавателÑ, КодПредмета)
278values (1, 1, 3);
279
280select РаÑÑчётСуммарнойÐагрузки(1);
281select РаÑÑчётÐалога(1);