Проверка ограничения срабатывает только при вставке, а не при обновлениях PostgresSQL

Мое ограничение проверки выглядит следующим образом:

ALTER TABLE tablename
ADD CONSTRAINT check_duplicate_rows 
CHECK (reject_duplicate_rows(columnB, columnC, columnD) < 2);

Я хочу, чтобы ограничение оценивалось только при вставке записи.

В настоящее время это работает как для операторов вставки, так и для операторов обновления. Проблема в том, что моей системе необходимо обновить вставленные строки, а ограничение проверки блокирует обновления.

Функция reject_duplicate_rows выглядит следующим образом:

CREATE OR REPLACE FUNCTION reject_duplicate_rows(columnB integer, columnC integer, columnD integer)
  RETURNS integer AS
$BODY$

DECLARE
    results INTEGER := 1;
    v_count INTEGER := 0;

BEGIN
    IF columnC <> 23 THEN
       RETURN results;
    END IF;

    SELECT total INTO v_count FROM 
        (SELECT  columnB,
                 columnC,
                 columnD,
                 count(*) AS  total 
        FROM     table_name
        WHERE B = columnB AND C = columnC AND D = columnD
        GROUP BY 1, 2, 3)
        as temp_table;

    IF COALESCE(v_count, 0) = 0 THEN
        RETURN results;
    END IF; 

    IF v_count >= 1 THEN
        results := 2;
    END IF;
    RETURN results;
EXCEPTION
  WHEN OTHERS THEN
    RETURN results;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 1000;
ALTER FUNCTION reject_duplicate_rows(integer, integer, integer)
  OWNER TO postgres

person Tau    schedule 24.03.2015    source источник


Ответы (1)


Вы пытались создать триггер UPDATE? см. Создание триггера postgresql

person Dani    schedule 24.03.2015