Как сгенерировать ошибку SQL при вставке, если в целевой таблице уже обнаружено n повторяющихся значений - PullRequest
1 голос
/ 03 октября 2019

У меня есть таблица пересечений, состоящая из двух столбцов: Программа обучения и Курс. Мой начальник попросил меня структурировать его так, чтобы людям было запрещено добавлять более 50 курсов в программу обучения.

Я думал, что мне следует сделать это с помощью триггера.

Я пыталсяследовать этому ... Postgres вставка или обновление триггера, КОГДА условие (старое)

CREATE OR REPLACE FUNCTION fn_count_tracks_per_map()
RETURNS TRIGGER AS
$BODY$
BEGIN 
    DECLARE
        val INTEGER;
        BEGIN
            SELECT COUNT(*) INTO val FROM ntnx_track_in_map m WHERE m.map_id = new.map_id; 
    IF val > 49
    THEN 
      RAISE EXCEPTION 'INSERT failed, maximum tracks in map reached'
    END IF;
    RETURN new;
END
$BODY$
    LANGUAGE plpgsql VOLATILE

Я получаю сообщение об ошибке - я попробовал пару вещейсинтаксис мудрый, но пока не помог, добавление и удаление;в основном image of failure

1 Ответ

1 голос
/ 03 октября 2019

Проблемы с вашим кодом:

  • оператор RAISE EXCEPTION должен заканчиваться точкой с запятой
  • есть два BEGIN s, а должен быть только один, послеобъявление переменных

Код:

CREATE OR REPLACE FUNCTION fn_count_tracks_per_map()
RETURNS TRIGGER AS
$BODY$
    DECLARE val INTEGER;
    BEGIN
        SELECT COUNT(*) INTO val FROM ntnx_track_in_map m WHERE m.map_id = new.map_id; 
        IF val > 49 THEN
            RAISE EXCEPTION 'INSERT failed, maximum tracks in map reached';
        END IF;
        RETURN new;
    END
$BODY$ 
LANGUAGE plpgsql VOLATILE;

Демонстрация на DB Fiddle

...