= Фаза 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(); }}}