wiki:DatabaseProgramming-AdvDb

Version 4 (modified by 231175, 12 days ago) ( diff )

--

Функции, процедури и тригери

Функции

Функција за креирање на review од страна на корисник за курс.

create or replace function write_review(
    user_id bigint,
    course_version_id bigint,
    new_rating int,
    new_comment text
)
    returns review
as
$$
    declare
        r review;
        e_id bigint;
    begin
        -- Validate rating first, before any DB work
        if new_rating < 1 or new_rating > 5 then
            raise exception 'Rating must be between 1 and 5, got %', new_rating
                using errcode = 'CHECK_VIOLATION';
        end if;


        select e.id into e_id
        from enrollment e
        where e.user_id = write_review.user_id
          and e.course_version_id = write_review.course_version_id
        limit 1;

        -- Validate enrollment exists
        if e_id is null then
            raise exception 'No enrollment found for user % on course version %',
                user_id, course_version_id
                using errcode = 'NO_DATA_FOUND';
        end if;

        -- Validate there's no review for that enrollment
        if exists(select 1 from review rv where rv.enrollment_id = e_id) then
            raise exception 'Review already submitted for enrollment %', e_id
                using errcode = 'UNIQUE_VIOLATION';
        end if;


        insert into review (rating, comment, date, enrollment_id)
        values (new_rating, new_comment, now(), e_id)
        returning * into r;

        return r;
    end;
$$ language plpgsql;

Процедури

Процедура за испраќање на мејлови за потсетување за онлајн состанок со експерт.

create or replace procedure send_all_emails()
as
$$
    declare
        email_to_send meeting_email_reminder;
    begin
        for email_to_send in
            select * from meeting_email_reminder where sent = false and scheduled_at <= now()
        loop
            perform pg_notify('send_email', email_to_send.id::text);


            update meeting_email_reminder set sent = true where id = email_to_send.id;
        end loop;
    end;
$$
    language plpgsql;

Тригери

Тригер за поставување на предходната верзија од курсот како неактивна при креирање на нова верзија.

create or replace function mark_course_version_as_inactive()
returns trigger
as $$
    begin
        update course_version
        set active = false
        where course_id = NEW.course_id;
        return NEW;
    end;
    $$ language plpgsql;

create trigger mark_course_version_as_inactive_trigger
before insert on course_version
for each row
execute function mark_course_version_as_inactive();
Note: See TracWiki for help on using the wiki.