2013-11-25 60 views
3

我是Postgresql newb。Postgresql觸發函數似乎阻止插入任何記錄

我創建了一個函數來檢查INSERT是否試圖在兩個不同的表中創建相同的值。

CREATE OR REPLACE FUNCTION check_pids_not_equal() 
    RETURNS trigger AS 
$BODY$ 
begin 
if exists (select * 
from cards c , echecks e 
where c.pid = e.pid) 
then 
raise NOTICE 'Must have different PID than entry in cards.pid'; 
end if; 
return null; 
end 
$BODY$ 
    LANGUAGE plpgsql 

我分配以這種方式觸發:

CREATE TRIGGER check_cards_pids_trigger 
    BEFORE INSERT OR UPDATE 
    ON cards 
    FOR EACH ROW 
    EXECUTE PROCEDURE check_pids_not_equal(); 

現在,每當我試圖做卡表記錄的任何插入,我總是得到INSERT 0 0沒有錯誤信息 - 即使記錄顯然是一個錯誤的記錄,缺少列或錯誤的列類型。

關於罪魁禍首的任何想法?另外,如何顯示更多錯誤報告?

回答

2

你必須return new如果你想插入記錄,這樣的事情:

CREATE OR REPLACE FUNCTION check_pids_not_equal() 
    RETURNS trigger AS 
$BODY$ 
begin 
    if exists (select * from cards c, echecks e where c.pid = e.pid) then 
     raise NOTICE 'Must have different PID than entry in cards.pid'; 
     return null; 
    end if; 
    return new; 
end 
$BODY$ 
LANGUAGE plpgsql 
+0

與INSERT固定的問題(我可以插入記錄),但是當我插入表Echecks已經存在一個PID在Cards pid中,插入仍然完成,即觸發器不會阻止插入,並根據需要提出通知。 – runit

+0

不知道你「存在」檢查應該做什麼。無論如何,您可以使用'new.pid'來獲取當前插入記錄的'pid' –

+2

謝謝。我需要使用new.pid關鍵字。我試圖使用cards.pid作爲參考,但隨後您的評論讓我意識到觸發器在插入之前工作。因此,cards.pid還沒有在參考表中。多謝。 – runit