代码之家  ›  专栏  ›  技术社区  ›  Truut

UPDATE语句中未分配旧记录

  •  0
  • Truut  · 技术社区  · 7 年前

    我在更新时创建了一个触发器,该触发器应该插入到表preishist中。

    //preishist
    CREATE TABLE preishist (
      updatenr varchar(4),
      preis numeric(8,2),
      pnr varchar(4),
      gueltigab date,
      PRIMARY KEY(updatenr));
    
    //produkt
    CREATE TABLE produkt(
    pnr varchar(4),
    name varchar(4),
    preis numeric(8,2),
    gultigab date,
    PRIMARY KEY(pnr));
    
    //Trigger
    CREATE TRIGGER trigger AFTER UPDATE ON produkt FOR EACH STATEMENT EXECUTE 
    PROCEDURE triggerfunc();
    
    
    //Triggerfunc
    CREATE FUNCTION triggerfunc RETURNS TRIGGER AS '
    begin 
       IF TG_OP = 'UPDATE' THEN 
          IF OLD.preis <> NEW.preis AND OLD.gueltigab < NEW.gueltigab THEN
             INSERT INTO preishist (preis,pnr,gultigab) VALUES (NEW.preis, NEW.pnr,NEW.gueltigab);
          end IF;
       end IF;                                                                                              
    end;
    

    当我试图更新produkt时,我得到了错误消息

    尚未分配旧记录。

    我很高兴能得到大家的帮助。

    1 回复  |  直到 7 年前
        1
  •  2
  •   a_horse_with_no_name    7 年前

    OLD NEW 只有在 水平触发器。您将触发器定义为语句级触发器。

    能够使用 旧版 新的 使用:

    CREATE TRIGGER trigger 
      AFTER UPDATE ON produkt 
      FOR EACH ROW --<< here
      EXECUTE PROCEDURE triggerfunc();