2015-03-18 5 views
0

Я хочу создать триггер перед вставкой и проверить внутри триггерной функции значения summary_id новой строки, которая будет вставлена, чтобы увидеть, существует ли summary_id в таблице. если он существует, то триггер должен вернуть значение null, поскольку я не хочу вставлять повторяющиеся значения. Я написал эту функцию, но, когда я попытался добавить новую повторяющуюся строку, она была вставлена ​​успешно!создать триггер перед вставкой

CREATE OR REPLACE FUNCTION trigger_ack_bi() 
RETURNS trigger AS $$ 
--DECLARE 
-- max_points INTEGER; 
BEGIN 

    IF(TG_OP = 'INSERT') THEN 
     IF NEW.ack_summary_id = (SELECT ack_summary_id FROM scm_main.tbl_ack WHERE scm_main.tbl_ack.ack_summary_id = NEW.ack_summary_id LIMIT 1) THEN 
       RETURN NULL; 
     ELSE 
       RETURN NEW; 
     END IF; 

    END IF; 
END; 
$$LANGUAGE plpgsql; 

CREATE TRIGGER trigger_ack_bi BEFORE INSERT ON 
scm_main.tbl_ack 
FOR EACH ROW 
EXECUTE PROCEDURE trigger_ack_bi() 


ALTER FUNCTION trigger_ack_bi() OWNER TO postgres; 
+0

Почему бы не просто создать уникальный индекс и обработать любые ошибки, исходящие из этого? Гораздо более надежным и быстрым, чем триггер. –

+0

. Вы могли бы расширить свой комментарий, чтобы быть более понятным. – Saman

+0

Сделайте столбец 'NOT NULL' и создайте уникальный индекс:' создайте уникальный индекс на tbl_ack (ack_summary_id) '. Это все, что вам нужно, никакого триггера не требуется –

ответ

0

Я рекомендую установить столбец быть NOT NULL и создание ПК на нем ...

alter table scm_main.tbl_ack alter column ack_summary_id set NOT NULL; 
alter table scm_main.tbl_ack add primary key (ack_summary_id); 
+0

Это сложно, я уже сделал это. Мне просто нужна функция триггера. – Saman

+2

@ user3313098: что «сложно» в отношении ПК или уникального ограничения? –

+0

ack_id уже является первичным ключом в таблице. и таблица уже создана. мой вопрос в том, что не добавление еще одного первичного ключа усложняет или изменяет отношение таблицы в соответствии с его отношением к другим таблицам и внешним ключам? – Saman

0

, кажется, функция запуска правильно. Но он работает в бесшумном режиме. Исключение составляет то, что мне нужно, чтобы убедиться, что дублирование было предотвращено. Благодарим вас за другие решения.

CREATE OR REPLACE FUNCTION trigger_ack_bi() 
RETURNS trigger AS $$ 
--DECLARE 
-- max_points INTEGER; 
BEGIN 

    IF(TG_OP = 'INSERT') THEN 
     IF NEW.ack_summary_id IS NULL THEN 
      RAISE EXCEPTION 'summaryID cannot be null'; 
     END IF; 

     IF NEW.ack_summary_id = (SELECT ack_summary_id FROM scm_main.tbl_ack WHERE scm_main.tbl_ack.ack_summary_id = NEW.ack_summary_id LIMIT 1) THEN 
      RAISE EXCEPTION 'duplication prevented..'; 
       RETURN NULL; 
     ELSE 
       RETURN NEW; 
     END IF; 

    END IF; 
END; 
$$LANGUAGE plpgsql; 

CREATE TRIGGER trigger_ack_bi BEFORE INSERT ON 
scm_main.tbl_ack 
FOR EACH ROW 
EXECUTE PROCEDURE trigger_ack_bi() 
Смежные вопросы