wiki:Triggers

Тригери

Проверка дали даден топик има уникатно име во parent

CREATE OR REPLACE FUNCTION fn_validate_topic_title()
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS
$$
BEGIN
    IF new.title IN
       (SELECT title
        FROM topic_thread AS t
        WHERE t.referenced_by = new.referenced_by
           OR (t.referenced_by IS NULL AND new.referenced_by IS NULL)
       )
    THEN
        RAISE EXCEPTION 'There already exists a topic with title % in parent topic with id %', new.title, new.referenced_by;
    END IF;
    RETURN new;
END;
$$;
CREATE OR REPLACE TRIGGER tr_check_topic_name
    BEFORE INSERT OR UPDATE
    ON topic_thread
    FOR EACH ROW
EXECUTE FUNCTION fn_validate_topic_title();

При креирање на топик, креаторот се внесува како модератор

CREATE OR REPLACE FUNCTION fn_insert_topics_creator_as_moderator()
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS
$$
DECLARE
    v_user_id INT;
BEGIN
    SELECT v_topic_thread.is_created_by
    INTO v_user_id
    FROM v_topic_thread
    WHERE v_topic_thread.id = NEW.id;

    IF NOT check_if_user_exists_in('moderator', 'id', v_user_id::text) THEN
        INSERT INTO moderator VALUES (v_user_id);
    END IF;

    INSERT INTO topic_thread_is_moderated_by_moderator(thread_id, user_id) VALUES (NEW.id, v_user_id);
    RETURN NEW;
END;
$$;
CREATE OR REPLACE TRIGGER tr_insert_topics_creator_as_moderator 
    AFTER INSERT
    ON topic_thread
    FOR EACH ROW
EXECUTE FUNCTION fn_insert_topics_creator_as_moderator();

При бришење на topic, проверка дали модераторот сеуште модерира topicци

CREATE OR REPLACE FUNCTION fn_remove_orphan_moderator()
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS
$$
BEGIN
    IF NOT EXISTS (
        SELECT 1
        FROM topic_thread_is_moderated_by_moderator t
        WHERE t.user_id = OLD.user_id
    ) THEN
        DELETE FROM moderator WHERE id = OLD.user_id;
    END IF;

    IF NOT EXISTS (
        SELECT 1
        FROM topic_thread_is_moderated_by_moderator t
        WHERE t.thread_id = OLD.thread_id
    ) THEN
        DELETE FROM discussion_thread WHERE contained_in = OLD.thread_id;
        DELETE FROM topic_thread WHERE id = OLD.thread_id;
    END IF;

    RETURN OLD;
END;
$$;
CREATE OR REPLACE TRIGGER tr_remove_orphan_moderator 
    AFTER DELETE
    ON topic_threads_moderators
    FOR EACH ROW
EXECUTE FUNCTION fn_remove_orphan_moderator();

При креирање на проект, креаторот се внесува како PROJECT_MANAGER

CREATE OR REPLACE FUNCTION fn_insert_project_manager()
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS
$$
DECLARE
    usrId INT;
    new_project_id INT;
BEGIN
    SELECT is_created_by, id
    INTO usrId, new_project_id
    FROM v_project_thread p
    WHERE NEW.id = p.id;

    IF NOT EXISTS(
        SELECT 1
        FROM developer_associated_with_project dawp
        WHERE dawp.in_project = new_project_id
          AND dawp.about_dev = usrId
    ) THEN
        INSERT INTO developer_associated_with_project(in_project, about_dev, started_at)
        VALUES (new_project_id, usrId, NOW());
    END IF;

    IF NOT check_if_user_exists_in('project_manager', 'id', usrId::text) THEN
        INSERT INTO project_manager VALUES (usrId);
    END IF;

    RETURN NEW;
END;
$$;
CREATE OR REPLACE TRIGGER tr_a_insert_project_manager --RADI
    AFTER INSERT
    ON project_thread
    FOR EACH ROW
EXECUTE FUNCTION fn_insert_project_manager();

Бришење на не користени тагови

CREATE OR REPLACE FUNCTION fn_delete_dangling_tags()
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS
$$
BEGIN
    IF NOT EXISTS (
        SELECT 1
        FROM tag_assigned_to_thread
        WHERE tag_name = OLD.tag_name
        GROUP BY tag_name
    ) THEN
        DELETE FROM tag WHERE name = OLD.tag_name;
    END IF;
    RETURN OLD;
END;
$$;
create or replace trigger tr_delete_dangling_tags
    after delete
    on tag_threads
    for each row
    execute function fn_delete_dangling_tags();

Внесување на даден корисник како developer, откако ќе стани дел од даден проект

CREATE OR REPLACE FUNCTION fn_add_dev_if_not_exist()
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS
$$
BEGIN
    IF NOT check_if_user_exists_in('developer', 'id', NEW.about_dev::text) THEN
        INSERT INTO developer VALUES (NEW.about_dev);
    END IF;
    RETURN NEW;
END;
$$;

create or replace trigger tr_add_dev_if_not_exist 
    before insert on developer_associated_with_project
    for each row
execute function fn_add_dev_if_not_exist();

Креирање на General канал, при креирање на даден проект

CREATE OR REPLACE FUNCTION fn_insert_general_for_project()
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS
$$
DECLARE
    developer_id INT;
BEGIN
    SELECT is_created_by
    INTO developer_id
    FROM thread t
    WHERE t.id = NEW.id;

    INSERT INTO channel(name, description, project_has, constructed_by)
    VALUES ('General', 'General', NEW.id, developer_id);

    RETURN NEW;
END;
$$;
create or replace trigger tr_insert_general_for_project 
    after insert on project_thread
    for each row
execute function fn_insert_general_for_project();

Сите 'pending' пријави за даден корисник стануваат 'accepted', при додавање на тој корисник во 'blacklist' листата.

CREATE OR REPLACE FUNCTION fn_change_status_on_pending_reports()
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS
$$
BEGIN
    RAISE NOTICE 'user_id: %, topic_id: %', NEW.refers_to, NEW.blacklisted_from;

    UPDATE submission
    SET status = 'ACCEPTED'
    WHERE id IN (
        SELECT id
        FROM report r
        WHERE r.about = NEW.refers_to
          AND r.for_misconduct_in = NEW.blacklisted_from
    );

    RETURN NEW;
END;
$$;
CREATE OR REPLACE TRIGGER tr_change_status_on_pending_reports
    AFTER INSERT
    ON blacklisted_user
    FOR EACH ROW
EXECUTE FUNCTION fn_change_status_on_pending_reports();

Оневозможувено повторно додавање на корисник во 'blacklist' листата, доколку е веќе присутен на неа

CREATE OR REPLACE FUNCTION fn_add_blacklisted_user()
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS
$$
BEGIN
    IF NOT EXISTS (
        SELECT 1
        FROM blacklisted_user
        WHERE blacklisted_from = NEW.blacklisted_from
          AND refers_to = NEW.refers_to
          AND end_date IS NULL
    ) THEN
        RETURN NEW;
    END IF;
    RETURN NULL;
END;
$$;
create or replace trigger tr_add_blacklisted_user
before insert on blacklisted_user
for each row
execute function fn_add_blacklisted_user();
Last modified 3 weeks ago Last modified on 09/25/25 21:19:16
Note: See TracWiki for help on using the wiki.