2014-02-13 92 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