首页 > 解决方案 > 更新后插入行(不是新的)的触发器

问题描述

我想创建一个触发器,该触发器在 novoitable 中插入带有日期的行以及带有相关日期的 ri_di 的 bi_id。我的更新是将状态属性上的 N(未付费)更改为“Y”。所以我不想在“跟踪”中插入任何新值。它们是已经存在但未更新的值。但是在触发器之后实际上插入了 3 行具有不同日期和 ri_id 的行。我只需要它插入一个!

Create table register(
BI_ID NUMBER,
ISBN Varchar(20),
RI_ID Varchar(50),
monthNum NUMBER,
CONSTRAINT register_pk PRIMARY KEY (AB_ID),
CONSTRAINT fk_magazine FOREIGN KEY (ISBN) REFERENCES MAGAZINE(ISBN),
CONSTRAINT fk_novoi FOREIGN KEY (IN_ID) REFERENCES novoi(IN_ID)
);

Create table novoi(
RI_ID Varchar(50),
CIN Varchar(50),
DATEI Date,
STATE Varchar(50),
CONSTRAINT nvoi_pk PRIMARY KEY (RI_ID),
CONSTRAINT fk_client FOREIGN KEY (CIN) REFERENCES CLIENT(CIN) 
);
CREATE TABLE Journalisation (
rui_ID NUMBER,
Datenovoi DATE,
BI_ID NUMBER,
CONSTRAINT FK_register FOREIGN KEY (BI_ID) REFERENCES register (BI_ID)
);

---

create or replace trigger T2
 after update on novoi 
 enable 
 declare
  CURSOR up_upda IS
    SELECT distinct novoi.datei, invoice.state, register.bi_id
    from register, novoi
    where  novoi.ri_id = register.ri_id ;        
begin
 for in_upda in up_upda loop
        dbms_output.put_line('check');
            INSERT INTO register(nui_id, datenovoi, bi_id) VALUES 
            (nui_seq.nextval, in_upda.datei, in_upda.bi_id);     
    end loop;
end; 
 update novoi set state = 'y' where datei = '04-04-19';

标签: oracleplsqltriggers

解决方案


据我了解您的问题,您可以在我使用:NEW. 您尚未在触发器中引用更新的记录,这就是将 3 条或多条记录插入目标表的原因。

CREATE OR REPLACE TRIGGER T2 AFTER
    UPDATE ON INVOICE
BEGIN
    DBMS_OUTPUT.PUT_LINE('check');
    INSERT INTO JOURNALISATION (
        JOUR_ID,
        DATEINVOICE,
        AB_ID
    )
        SELECT JOUR_SEQ.NEXTVAL,
               :NEW.DATEI,
               ABONNEMENT.AB_ID
          FROM ABONNEMENT
         WHERE :NEW.IN_ID = ABONNEMENT.IN_ID;

END;
/

如果我的理解不正确或代码未按预期工作,请发表评论。


推荐阅读