PL / PgSQL在插入时创建条件触发器

时间:2014-02-13 14:52:28

标签: sql postgresql triggers conditional

我正在研究我的第一个触发器。当我在表上执行INSERT时,我想条件性地从其他表中删除行。

这是一个触发器:

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();

作为错误,我看到NEW或OLD(如果我通知触发器)未声明/未知。问题在哪里?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

您声明了触发器FOR EACH STATEMENT。也许你需要FOR EACH ROW

FOR EACH STATEMENT触发器没有NEWOLD