Фаза 4 - Функции, процедури, тригери
Функции
get_avg_gpa_by_university
Пресметува просечна GPA на сите студенти запишани на факултети кои припаѓаат на даден универзитет. Се користи при генерирање на академски извештаи и споредба на успешноста на студентите по универзитет.
CREATE OR REPLACE FUNCTION get_avg_gpa_by_university(p_university_id INT)
RETURNS FLOAT AS $func$
DECLARE
avg_gpa FLOAT;
BEGIN
SELECT AVG(u.gpa) INTO avg_gpa
FROM "User" u
JOIN Studies s ON s.user_id = u.user_id
JOIN StudyProgram sp ON sp.study_program_id = s.study_program_id
JOIN Faculty f ON f.faculty_id = sp.faculty_id
WHERE f.university_id = p_university_id;
RETURN avg_gpa;
END;
$func$ LANGUAGE plpgsql;
get_employment_count_by_company
Враќа вкупниот број на вработувања (минати и тековни) за одредена компанија. Се користи за аналитика на компании и рангирање според бројот на вработени alumni.
CREATE OR REPLACE FUNCTION get_employment_count_by_company(p_company_id INT)
RETURNS INT AS $func$
DECLARE
emp_count INT;
BEGIN
SELECT COUNT(*) INTO emp_count FROM Employment WHERE company_id = p_company_id;
RETURN emp_count;
END;
$func$ LANGUAGE plpgsql;
get_user_skills
Враќа табела со сите вештини (ime и тип) кои ги поседува одреден корисник. Се користи при приказ на профилот на корисникот и при пребарување на кандидати по вештини.
CREATE OR REPLACE FUNCTION get_user_skills(p_user_id INT)
RETURNS TABLE(skill_name VARCHAR, skill_type VARCHAR) AS $func$
BEGIN
RETURN QUERY
SELECT s.skill_name, s.type
FROM Skill s
JOIN User_Skill us ON us.skill_id = s.skill_id
WHERE us.user_id = p_user_id;
END;
$func$ LANGUAGE plpgsql;
Процедури
add_user_with_studies
Додава нов корисник во системот и автоматски го запишува на студиска програма со статус 'active', сè во рамки на една трансакција. Ја имплементира бизнис логиката за регистрација на нов student во системот — корисникот не може да постои без студиска програма.
CREATE OR REPLACE PROCEDURE add_user_with_studies(
p_first_name VARCHAR, p_last_name VARCHAR, p_email VARCHAR,
p_study_program_id INT, p_start_date DATE
)
LANGUAGE plpgsql AS $func$
DECLARE v_user_id INT;
BEGIN
IF EXISTS (SELECT 1 FROM "User" WHERE email = p_email) THEN
RAISE EXCEPTION 'Корисник со е-пошта % веќе постои!', p_email;
END IF;
INSERT INTO "User"(first_name, last_name, email)
VALUES(p_first_name, p_last_name, p_email) RETURNING user_id INTO v_user_id;
INSERT INTO Studies(study_program_id, user_id, start_date, status)
VALUES(p_study_program_id, v_user_id, p_start_date, 'active');
RAISE NOTICE 'Корисник % % успешно додаден! ID: %', p_first_name, p_last_name, v_user_id;
END;
$func$;
add_employment_with_salary
Креира ново вработување и почетна плата во историјата. Ако корисникот веќе има тековно вработување (is_current = 1), само додава нов запис за плата без да креира дупликат вработување. Ја имплементира логиката за управување со кариерата на alumni.
CREATE OR REPLACE PROCEDURE add_employment_with_salary(
p_user_id INT, p_company_id INT, p_start_date DATE,
p_employment_type VARCHAR, p_salary INT, p_currency VARCHAR
)
LANGUAGE plpgsql AS $func$
DECLARE v_employment_id INT; v_existing_emp_id INT;
BEGIN
SELECT employment_id INTO v_existing_emp_id
FROM Employment WHERE user_id = p_user_id AND is_current = 1 LIMIT 1;
IF v_existing_emp_id IS NOT NULL THEN
INSERT INTO SalaryHistory(effective_from, currency, salary_amount, employment_id)
VALUES(p_start_date, p_currency, p_salary, v_existing_emp_id);
RAISE NOTICE 'Платата ажурирана на % %!', p_salary, p_currency;
ELSE
INSERT INTO Employment(start_date, employment_type, currency,
is_current, promotion_flag, user_id, company_id)
VALUES(p_start_date, p_employment_type, p_currency, 1, 0, p_user_id, p_company_id)
RETURNING employment_id INTO v_employment_id;
INSERT INTO SalaryHistory(effective_from, currency, salary_amount, employment_id)
VALUES(p_start_date, p_currency, p_salary, v_employment_id);
RAISE NOTICE 'Ново вработување додадено со плата % %!', p_salary, p_currency;
END IF;
END;
$func$;
add_startup_with_founder
Регистрира нов стартап и автоматски го поврзува со основачот. Проверува дали стартапот веќе постои и дали статусот е валиден. Ја имплементира логиката за евидентирање на претприемачката активност на alumni.
CREATE OR REPLACE PROCEDURE add_startup_with_founder(
p_name VARCHAR, p_status VARCHAR, p_description VARCHAR,
p_company_id INT, p_user_id INT
)
LANGUAGE plpgsql AS $func$
DECLARE v_startup_id INT;
BEGIN
IF EXISTS (SELECT 1 FROM Startup WHERE name = p_name) THEN
RAISE EXCEPTION 'Стартап со именото % веќе постои!', p_name;
END IF;
IF p_status NOT IN ('active', 'closed', 'acquired') THEN
RAISE EXCEPTION 'Невалиден статус! Дозволени: active, closed, acquired.';
END IF;
INSERT INTO Startup(name, status, description, company_id)
VALUES(p_name, p_status, p_description, p_company_id) RETURNING startup_id INTO v_startup_id;
INSERT INTO Founder(user_id, startup_id) VALUES(p_user_id, v_startup_id);
RAISE NOTICE 'Стартапот % успешно креиран! ID: %', p_name, v_startup_id;
END;
$func$;
add_promotion
Додава унапредување за постоечко вработување со валидација дека нивоата се различни и зголемувањето е позитивно. Ја имплементира бизнис логиката за следење на кариерниот напредок на alumni.
CREATE OR REPLACE PROCEDURE add_promotion(
p_employment_id INT, p_promotion_date DATE,
p_old_job_level VARCHAR, p_new_job_level VARCHAR, p_salary_increase INT
)
LANGUAGE plpgsql AS $func$
BEGIN
IF p_old_job_level = p_new_job_level THEN
RAISE EXCEPTION 'Старото и новото ниво не смеат да бидат исти!';
END IF;
INSERT INTO Promotion(promotion_date, old_job_level, new_job_level,
salary_increase, employment_id)
VALUES(p_promotion_date, p_old_job_level, p_new_job_level,
p_salary_increase, p_employment_id);
RAISE NOTICE 'Унапредување: % -> % за вработување ID %',
p_old_job_level, p_new_job_level, p_employment_id;
END;
$func$;
add_event_with_participants
Додава нов настан и автоматски запишува листа на учесници. Ако некој корисник не постои, се прескокнува со предупредување. Ја имплементира логиката за управување со настани и мрежата на alumni.
CREATE OR REPLACE PROCEDURE add_event_with_participants(
p_name VARCHAR, p_date DATE, p_location VARCHAR,
p_company_id INT, p_user_ids INT[]
)
LANGUAGE plpgsql AS $func$
DECLARE v_event_id INT; v_user_id INT;
BEGIN
INSERT INTO Event(name, "date", location, company_id)
VALUES(p_name, p_date, p_location, p_company_id) RETURNING event_id INTO v_event_id;
FOREACH v_user_id IN ARRAY p_user_ids LOOP
IF NOT EXISTS (SELECT 1 FROM "User" WHERE user_id = v_user_id) THEN
RAISE WARNING 'Корисник % не постои, прескокнат.', v_user_id;
CONTINUE;
END IF;
INSERT INTO Event_User(event_id, user_id, role)
VALUES(v_event_id, v_user_id, 'attendee') ON CONFLICT DO NOTHING;
END LOOP;
RAISE NOTICE 'Настанот % успешно креиран! ID: %', p_name, v_event_id;
END;
$func$;
add_position
Додава нова позиција за постоечко вработување и автоматски го превзема company_id. Ја имплементира логиката за следење на работните позиции на alumni низ нивната кариера.
CREATE OR REPLACE PROCEDURE add_position(
p_employment_id INT, p_title VARCHAR,
p_job_level VARCHAR, p_job_category VARCHAR
)
LANGUAGE plpgsql AS $func$
DECLARE v_company_id INT;
BEGIN
SELECT company_id INTO v_company_id FROM Employment WHERE employment_id = p_employment_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'Вработување со ID % не постои!', p_employment_id;
END IF;
INSERT INTO position(title, job_level, job_category, employment_id, company_id)
VALUES(p_title, p_job_level, p_job_category, p_employment_id, v_company_id);
RAISE NOTICE 'Позиција % успешно додадена за вработување ID %', p_title, p_employment_id;
END;
$func$;
add_internship
Додава пракса за корисник во компанија со валидација на датуми. Ја имплементира бизнис логиката за евидентирање на студентски пракси пред или за време на студирањето.
CREATE OR REPLACE PROCEDURE add_internship(
p_user_id INT, p_company_id INT, p_start_date DATE, p_end_date DATE
)
LANGUAGE plpgsql AS $func$
BEGIN
IF p_end_date IS NOT NULL AND p_end_date <= p_start_date THEN
RAISE EXCEPTION 'Датумот на завршување мора да биде после почетокот!';
END IF;
INSERT INTO Internship(start_date, end_date, user_id, company_id)
VALUES(p_start_date, p_end_date, p_user_id, p_company_id);
RAISE NOTICE 'Пракса успешно додадена за корисник % во компанија %', p_user_id, p_company_id;
END;
$func$;
add_award
Додава награда за корисник поврзана со компанија. Ја имплементира логиката за следење на достигнувањата и признанијата на alumni во нивната кариера.
CREATE OR REPLACE PROCEDURE add_award(
p_user_id INT, p_company_id INT,
p_title VARCHAR, p_organization VARCHAR, p_date DATE
)
LANGUAGE plpgsql AS $func$
BEGIN
INSERT INTO Award(title, organization, "date", company_id, user_id)
VALUES(p_title, p_organization, p_date, p_company_id, p_user_id);
RAISE NOTICE 'Награда "%" успешно додадена за корисник %', p_title, p_user_id;
END;
$func$;
add_course_completion
Запишува корисник на дополнителен курс или ажурира статус ако веќе е запишан. Ја имплементира логиката за следење на континуираното образование и професионален развој на alumni.
CREATE OR REPLACE PROCEDURE add_course_completion(
p_user_id INT, p_course_id INT,
p_status VARCHAR, p_completion_date DATE DEFAULT NULL
)
LANGUAGE plpgsql AS $func$
BEGIN
IF p_status NOT IN ('in-progress', 'completed', 'failed') THEN
RAISE EXCEPTION 'Невалиден статус!';
END IF;
IF EXISTS (SELECT 1 FROM AdditionalCourse_User
WHERE user_id = p_user_id AND additional_course_id = p_course_id) THEN
UPDATE AdditionalCourse_User SET status = p_status, completion_date = p_completion_date
WHERE user_id = p_user_id AND additional_course_id = p_course_id;
ELSE
INSERT INTO AdditionalCourse_User(user_id, additional_course_id, completion_date, status)
VALUES(p_user_id, p_course_id, p_completion_date, p_status);
END IF;
RAISE NOTICE 'Статус % за курс % на корисник % ажуриран.', p_status, p_course_id, p_user_id;
END;
$func$;
update_study_status
Ажурира статусот на студии (active → completed/dropped). Ако статусот е 'completed', автоматски генерира диплома. Ја имплементира бизнис логиката за завршување на студиите.
CREATE OR REPLACE PROCEDURE update_study_status(
p_studies_id INT, p_new_status VARCHAR, p_end_date DATE DEFAULT NULL
)
LANGUAGE plpgsql AS $func$
DECLARE v_start_date DATE;
BEGIN
SELECT start_date INTO v_start_date FROM Studies WHERE studies_id = p_studies_id;
IF NOT FOUND THEN RAISE EXCEPTION 'Студии со ID % не постојат!', p_studies_id; END IF;
UPDATE Studies SET status = p_new_status, end_date = p_end_date WHERE studies_id = p_studies_id;
IF p_new_status = 'completed' AND p_end_date IS NOT NULL THEN
INSERT INTO Diploma(graduation_date, thesis_title, studies_id)
VALUES(p_end_date, 'Дипломски труд ' || p_studies_id, p_studies_id)
ON CONFLICT DO NOTHING;
RAISE NOTICE 'Студиите завршени и диплома додадена!';
END IF;
END;
$func$;
add_skill_to_user
Додава вештина на корисник со проверка за дупликат. Ја имплементира логиката за управување со портфолиото на вештини на alumni.
CREATE OR REPLACE PROCEDURE add_skill_to_user(p_user_id INT, p_skill_id INT)
LANGUAGE plpgsql AS $func$
BEGIN
IF EXISTS (SELECT 1 FROM User_Skill WHERE user_id = p_user_id AND skill_id = p_skill_id) THEN
RAISE EXCEPTION 'Корисникот веќе ја поседува оваа вештина!';
END IF;
INSERT INTO User_Skill(user_id, skill_id) VALUES(p_user_id, p_skill_id);
RAISE NOTICE 'Вештина % успешно додадена на корисник %', p_skill_id, p_user_id;
END;
$func$;
remove_skill_from_user
Брише вештина од корисник. Се користи кога корисникот сака да го ажурира своето профилно портфолио на вештини.
CREATE OR REPLACE PROCEDURE remove_skill_from_user(p_user_id INT, p_skill_id INT)
LANGUAGE plpgsql AS $func$
BEGIN
IF NOT EXISTS (SELECT 1 FROM User_Skill WHERE user_id = p_user_id AND skill_id = p_skill_id) THEN
RAISE EXCEPTION 'Корисник % нема вештина со ID %!', p_user_id, p_skill_id;
END IF;
DELETE FROM User_Skill WHERE user_id = p_user_id AND skill_id = p_skill_id;
RAISE NOTICE 'Вештина % отстранета од корисник %', p_skill_id, p_user_id;
END;
$func$;
end_employment
Завршува тековно вработување — поставува is_current = 0 и end_date, и го затвора последниот запис во SalaryHistory. Ја имплементира логиката за евидентирање на напуштање на работното место.
CREATE OR REPLACE PROCEDURE end_employment(p_employment_id INT, p_end_date DATE)
LANGUAGE plpgsql AS $func$
BEGIN
IF NOT EXISTS (SELECT 1 FROM Employment WHERE employment_id = p_employment_id AND is_current = 1) THEN
RAISE EXCEPTION 'Вработувањето не постои или веќе е завршено!';
END IF;
UPDATE Employment SET is_current = 0, end_date = p_end_date WHERE employment_id = p_employment_id;
UPDATE SalaryHistory SET effective_to = p_end_date
WHERE employment_id = p_employment_id AND effective_to IS NULL;
RAISE NOTICE 'Вработување % завршено на %', p_employment_id, p_end_date;
END;
$func$;
update_salary
Додава нов запис во SalaryHistory и го затвора претходниот. Ја имплементира бизнис логиката за следење на историјата на плати на alumni низ времето.
CREATE OR REPLACE PROCEDURE update_salary(
p_employment_id INT, p_new_salary INT,
p_currency VARCHAR, p_effective_from DATE
)
LANGUAGE plpgsql AS $func$
BEGIN
IF p_new_salary <= 0 THEN RAISE EXCEPTION 'Платата мора да биде позитивна!'; END IF;
UPDATE SalaryHistory SET effective_to = p_effective_from - 1
WHERE employment_id = p_employment_id AND effective_to IS NULL;
INSERT INTO SalaryHistory(effective_from, currency, salary_amount, employment_id)
VALUES(p_effective_from, p_currency, p_new_salary, p_employment_id);
RAISE NOTICE 'Платата ажурирана на % % за вработување %', p_new_salary, p_currency, p_employment_id;
END;
$func$;
enroll_existing_user
Запишува постоечки корисник на нова студиска програма. Проверува дали веќе е активно запишан. Се користи кога alumni продолжува со образование (втор циклус, PhD).
CREATE OR REPLACE PROCEDURE enroll_existing_user(
p_user_id INT, p_study_program_id INT, p_start_date DATE
)
LANGUAGE plpgsql AS $func$
BEGIN
IF EXISTS (SELECT 1 FROM Studies WHERE user_id = p_user_id
AND study_program_id = p_study_program_id AND status = 'active') THEN
RAISE EXCEPTION 'Корисникот веќе е активно запишан на оваа програма!';
END IF;
INSERT INTO Studies(study_program_id, user_id, start_date, status)
VALUES(p_study_program_id, p_user_id, p_start_date, 'active');
RAISE NOTICE 'Корисник % успешно запишан на програма %', p_user_id, p_study_program_id;
END;
$func$;
add_diploma
Директно додава диплома за завршени студии. Дозволено само ако студиите имаат статус 'completed'. Ја имплементира логиката за потврда на академската квалификација на alumni.
CREATE OR REPLACE PROCEDURE add_diploma(
p_studies_id INT, p_graduation_date DATE, p_thesis_title VARCHAR
)
LANGUAGE plpgsql AS $func$
DECLARE v_status VARCHAR;
BEGIN
SELECT status INTO v_status FROM Studies WHERE studies_id = p_studies_id;
IF v_status != 'completed' THEN
RAISE EXCEPTION 'Не може диплома за студии со статус "%"!', v_status;
END IF;
IF EXISTS (SELECT 1 FROM Diploma WHERE studies_id = p_studies_id) THEN
RAISE EXCEPTION 'Диплома за овие студии веќе постои!';
END IF;
INSERT INTO Diploma(graduation_date, thesis_title, studies_id)
VALUES(p_graduation_date, p_thesis_title, p_studies_id);
RAISE NOTICE 'Диплома успешно додадена за studies_id %', p_studies_id;
END;
$func$;
add_company
Додава нова компанија со валидација на индустрија и број на вработени. Се користи при проширување на базата на компании со кои alumni се поврзани.
CREATE OR REPLACE PROCEDURE add_company(
p_name VARCHAR, p_number_employees INT, p_industry_id INT
)
LANGUAGE plpgsql AS $func$
BEGIN
IF EXISTS (SELECT 1 FROM Company WHERE name = p_name) THEN
RAISE EXCEPTION 'Компанија со именото % веќе постои!', p_name;
END IF;
IF p_number_employees < 0 THEN
RAISE EXCEPTION 'Бројот на вработени не може да биде негативен!';
END IF;
INSERT INTO Company(name, number_employees, industry_id)
VALUES(p_name, p_number_employees, p_industry_id);
RAISE NOTICE 'Компанија % успешно додадена!', p_name;
END;
$func$;
add_industry
Додава нова индустрија со проверка за уникатност. Се користи при проширување на категоризацијата на компании во системот.
CREATE OR REPLACE PROCEDURE add_industry(p_industry_name VARCHAR, p_sector_category VARCHAR)
LANGUAGE plpgsql AS $func$
BEGIN
IF EXISTS (SELECT 1 FROM Industry WHERE industry_name = p_industry_name) THEN
RAISE EXCEPTION 'Индустрија со именото % веќе постои!', p_industry_name;
END IF;
INSERT INTO Industry(industry_name, sector_category) VALUES(p_industry_name, p_sector_category);
RAISE NOTICE 'Индустрија % успешно додадена!', p_industry_name;
END;
$func$;
update_startup_status
Менува статусот на стартап (active → closed/acquired). Ја имплементира логиката за следење на животниот циклус на стартапите основани од alumni.
CREATE OR REPLACE PROCEDURE update_startup_status(p_startup_id INT, p_new_status VARCHAR)
LANGUAGE plpgsql AS $func$
DECLARE v_current_status VARCHAR;
BEGIN
SELECT status INTO v_current_status FROM Startup WHERE startup_id = p_startup_id;
IF NOT FOUND THEN RAISE EXCEPTION 'Стартап со ID % не постои!', p_startup_id; END IF;
IF v_current_status = p_new_status THEN
RAISE EXCEPTION 'Стартапот веќе има статус "%"!', p_new_status;
END IF;
UPDATE Startup SET status = p_new_status WHERE startup_id = p_startup_id;
RAISE NOTICE 'Стартап %: статус сменет од % на %', p_startup_id, v_current_status, p_new_status;
END;
$func$;
add_founder_to_startup
Додава уште еден основач на постоечки стартап со проверка за дупликат. Се користи кога стартап има повеќе соосновачи меѓу alumni.
CREATE OR REPLACE PROCEDURE add_founder_to_startup(p_user_id INT, p_startup_id INT)
LANGUAGE plpgsql AS $func$
BEGIN
IF EXISTS (SELECT 1 FROM Founder WHERE user_id = p_user_id AND startup_id = p_startup_id) THEN
RAISE EXCEPTION 'Корисникот веќе е основач на овој стартап!';
END IF;
INSERT INTO Founder(user_id, startup_id) VALUES(p_user_id, p_startup_id);
RAISE NOTICE 'Корисник % додаден како основач на стартап %', p_user_id, p_startup_id;
END;
$func$;
remove_user
Безбедно брише корисник од системот. Тригерот trg_prevent_delete_active_student автоматски го спречува бришењето ако корисникот има активни студии, обезбедувајќи интегритет на податоците.
CREATE OR REPLACE PROCEDURE remove_user(p_user_id INT)
LANGUAGE plpgsql AS $func$
BEGIN
IF NOT EXISTS (SELECT 1 FROM "User" WHERE user_id = p_user_id) THEN
RAISE EXCEPTION 'Корисник со ID % не постои!', p_user_id;
END IF;
DELETE FROM "User" WHERE user_id = p_user_id;
RAISE NOTICE 'Корисник % успешно избришан!', p_user_id;
END;
$func$;
cancel_internship
Предвремено завршува пракса со поставување на end_date. Се користи при предвремено прекинување на пракса поради различни околности.
CREATE OR REPLACE PROCEDURE cancel_internship(p_internship_id INT, p_end_date DATE)
LANGUAGE plpgsql AS $func$
DECLARE v_start_date DATE;
BEGIN
SELECT start_date INTO v_start_date FROM Internship WHERE internship_id = p_internship_id;
IF NOT FOUND THEN RAISE EXCEPTION 'Пракса со ID % не постои!', p_internship_id; END IF;
IF p_end_date <= v_start_date THEN
RAISE EXCEPTION 'Датумот на завршување мора да биде после почетокот!';
END IF;
UPDATE Internship SET end_date = p_end_date WHERE internship_id = p_internship_id;
RAISE NOTICE 'Пракса % завршена на датум %', p_internship_id, p_end_date;
END;
$func$;
Тригери
trg_prevent_delete_active_student
Спречува бришење на корисник кој моментално има активни студии, фрлајќи исклучок пред да се изврши DELETE операцијата. Ја имплементира бизнис логиката за заштита на академските записи — активен студент не може да биде избришан од системот.
CREATE OR REPLACE FUNCTION prevent_delete_active_student()
RETURNS TRIGGER AS $func$
BEGIN
IF EXISTS (SELECT 1 FROM Studies WHERE user_id = OLD.user_id AND status = 'active') THEN
RAISE EXCEPTION 'Не може да се избрише корисник со активни студии!';
END IF;
RETURN OLD;
END;
$func$ LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER trg_prevent_delete_active_student
BEFORE DELETE ON "User"
FOR EACH ROW EXECUTE FUNCTION prevent_delete_active_student();
trg_update_current_employment
При додавање на ново тековно вработување (is_current = 1), автоматски ги поставува сите претходни вработувања на истиот корисник на is_current = 0. Ја имплементира бизнис логиката дека корисникот може да има само едно тековно вработување истовремено.
CREATE OR REPLACE FUNCTION update_current_employment()
RETURNS TRIGGER AS $func$
BEGIN
IF NEW.is_current = 1 THEN
UPDATE Employment SET is_current = 0
WHERE user_id = NEW.user_id
AND employment_id != NEW.employment_id
AND is_current = 1;
END IF;
RETURN NEW;
END;
$func$ LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER trg_update_current_employment
AFTER INSERT ON Employment
FOR EACH ROW EXECUTE FUNCTION update_current_employment();
trg_check_promotion_flag
При додавање на нова промоција, автоматски го поставува promotion_flag на 1 во табелата Employment доколку не е веќе поставен. Ја имплементира логиката за автоматско означување на вработувања со историја на унапредување, без потреба од рачно ажурирање.
CREATE OR REPLACE FUNCTION check_promotion_flag()
RETURNS TRIGGER AS $func$
DECLARE v_flag INT;
BEGIN
SELECT promotion_flag INTO v_flag FROM Employment WHERE employment_id = NEW.employment_id;
IF v_flag = 0 THEN
UPDATE Employment SET promotion_flag = 1 WHERE employment_id = NEW.employment_id;
RAISE NOTICE 'promotion_flag автоматски поставен на 1!';
END IF;
RETURN NEW;
END;
$func$ LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER trg_check_promotion_flag
AFTER INSERT ON Promotion
FOR EACH ROW EXECUTE FUNCTION check_promotion_flag();
