2014-02-13 117 views
0

我正在研究我的第一個觸發器。當我在表上執行INSERT時,我想有條件地從其他表中刪除行。PL/PgSQL在插入時創建條件觸發器

這裏是一個觸發器:

CREATE OR REPLACE FUNCTION clear_seen_by() 
    RETURNS trigger AS 
$BODY$ 
    BEGIN 
     IF (OLD.popup = '1') THEN 
       DELETE FROM news_seen_by; 
      END IF; 

     RETURN NULL; 
    END; 
    $BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

援引:

CREATE TRIGGER clear_seen_by 
    AFTER INSERT 
    ON news 
    FOR EACH STATEMENT 
    EXECUTE PROCEDURE clear_seen_by(); 

作爲一個錯誤我看到新的或舊(如果我motify觸發)未聲明/未知。哪裏有問題?

回答

1

在INSERT語句中,您沒有定義OLD記錄。

您應該使用NEW.popup代替,並且還聲明觸發器爲FOR EACH ROW

CREATE OR REPLACE FUNCTION clear_seen_by() RETURNS trigger AS 
    $BODY$ 
    BEGIN 
     IF (NEW.popup = '1') THEN 
     DELETE FROM news_seen_by; 
     END IF; 

     RETURN NULL; 
    END; 
    $BODY$ 
    LANGUAGE plpgsql VOLATILE COST 100; 


    CREATE TRIGGER 
    clear_seen_by 
    AFTER INSERT ON 
    news 
    FOR EACH ROW EXECUTE PROCEDURE 
    clear_seen_by(); 
+0

不,我嘗試了兩個 - 與OLD和NEW相同的錯誤:SQLSTATE [55000]:對象不處於先決條件狀態:7〜記錄NEW/OLD的結構未知但 –

+1

然後將觸發器定義爲'爲每一行'。 –

+0

我剛剛編輯了相應的答案。 –

1

您聲明瞭觸發器FOR EACH STATEMENT。也許你需要FOR EACH ROW

FOR EACH STATEMENT觸發器沒有NEWOLD