【问题标题】:PL/PgSQL creating a conditional trigger on insertPL/PgSQL 在插入时创建条件触发器
【发布时间】:2014-03-12 12:38:43
【问题描述】:

我正在开发我的第一个触发器。当我在表上执行 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(如果我设计了触发器)没有声明/未知。问题出在哪里?

【问题讨论】:

    标签: sql postgresql triggers conditional


    【解决方案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();
    

    【讨论】:

    • 没有。我尝试了两者 - OLD 和 NEW 出现相同的错误:SQLSTATE[55000]: Object not in 先决状态:7 ~记录 NEW/OLD 的结构尚未知
    • 啊,然后定义触发器为FOR EACH ROW
    【解决方案2】:

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

    FOR EACH STATEMENT 触发器没有NEWOLD

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多